如何一次性将日累计、月累计、年累计统计出来

Triumph 2011-09-16 08:41:29
表结构如下:
【ID】guid类型
【Date】日期类型
【Name】文本类型
【Category】文本枚举类型
【IsActive】逻辑类型
【Quantity】整形


现要求:给定一个日期,统计出这个该日期的 Quantity 之和,截止到该日期的当月的 Quantity 之和,截止到该日期的当年的 Quantity 之和,按 Name 和 IsActive 分组,结果如下:

Name IsActive DaySum MonthSum YearSum
--------------------------------------
aaa true 100 1000 10000
aaa false 200 2000 20000
bbb true 300 3000 30000
bbb false 400 4000 40000
...



实体类型与数据表结构相同,请教用 linq 语句如何实现?
...全文
549 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Triumph 2011-09-18
  • 打赏
  • 举报
回复
感谢 q107770540 !

用你的方法后结果非常完美。

查看生成的 SQL 语句长了不少,有很多 case 和 when 判断,不过查询时间好像没什么区别,不知道具体效能如何?

在此之前我是实在没办法,用了三个 linq 语句分别查询年、月、日的累计,单个生成的SQL语句很短很简洁。现在对比之下,查询三次的时间和上面查询一次好像也没什么差别,不知道两者效能如何?
q107770540 2011-09-18
  • 打赏
  • 举报
回复
DateTime dt=...;//这是给定的日期
var query=from t in db.TableA
where System.Data.Linq.SqlClient.SqlMethods.DateDiffDay(dt,t.Date)<=365
group t by new {t.Name,t.IsActive} into g
let day=g.Where(m=>System.Data.Linq.SqlClient.SqlMethods.DateDiffDay(dt,m.Date)<=1)
let month=g.Where(m=>System.Data.Linq.SqlClient.SqlMethods.DateDiffMonth(dt,m.Date)<=1)
select new
{
Name=g.Key.Name,
IsActive=g.Key.IsActive,
DaySum=day==null?0:day.Count(),
MonthSum=month==null?0:month.Count(),
YearSum=g.Count()
};

你的问题 加个非空判断试试
Triumph 2011-09-17
  • 打赏
  • 举报
回复
查看生成的 SQL 语句,其中计算累计的子语句是:

...
(select sum([Quantity]) .... ) As DaySum
...

在查询器里面单独执行这一行语句,如果查询结果是数字,则 Linq 语句执行就没问题,如果查询结果是 Null,就会出现上面的错误。

很显然,如果查询结果有 Null 值,例如在 SQLServer 里面直接查询结果是下面的 4 行:
aaa true 100 1000 10000
aaa false null 2000 20000
bbb true 300 3000 30000
bbb false null null 40000

这样在程序里面就会出错。


请教有没有解决办法?


Triumph 2011-09-17
  • 打赏
  • 举报
回复
出错是在 Linq 语句执行后的赋值语句里,将日、月、年的累计结果赋到整形变量时出错。
很不理解,按理说如果 Where 结果为0,那么 Sum 的结果也应该为 0 值的,但实际上显然不是,所以才会出错。

请问这是为什么?
Triumph 2011-09-16
  • 打赏
  • 举报
回复
非常感谢。貌似可以,但如果 Where 结果为 0 时,即没有符合的记录时,会出错,提示为:
【到值类型“Int32”的强制转换失败,因为具体化值为 null。结果类型的泛型参数或查询必须使用可以为 null 的类型。】

将 Sum 改为 Count 时,可以看到查询结果很多为 0 ,这时就会出错
Gemini Dean 2011-09-16
  • 打赏
  • 举报
回复
顶上去
Gemini Dean 2011-09-16
  • 打赏
  • 举报
回复
顶上去
你的选择B 2011-09-16
  • 打赏
  • 举报
回复

var result=from u in db.Table
group u by new
{
u.Name,
u.IsActive
}
into g
select new
{
DaySum =g.Sum(c=>c.Quantity),
MonthSum =(from n in g
where n.Date.AddDays(-yourDate.Day)<n.Date<yourDate
select n.Quantity).Sum(),
YearSum=(from n in g
where n.Date.AddMonths(-yourDate.Month).AddDays(-yourDate.Day)<n.Date<yourDate
select n.Quantity).Sum()
};

q107770540 2011-09-16
  • 打赏
  • 举报
回复
Try:

DateTime dt=...;//这是给定的日期
var query=from t in db.TableA
where System.Data.Linq.SqlClient.SqlMethods.DateDiffDay(dt,t.Date)<=365
group t by new {t.Name,t.IsActive} into g
select new
{
Name=g.Key.Name,
IsActive=g.Key.IsActive,
DaySum=g.Where(m=>System.Data.Linq.SqlClient.SqlMethods.DateDiffDay(dt,m.Date)<=1).Count(),
MonthSum=g.Where(m=>System.Data.Linq.SqlClient.SqlMethods.DateDiffMonth(dt,m.Date)<=1).Count(),
YearSum=g.Count()
};

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧