按月分组计数

Posted

技术标签:

【中文标题】按月分组计数【英文标题】:Group count by month 【发布时间】:2017-07-26 20:38:36 【问题描述】:

我正在尝试返回一个月内有多少客户“注册”的结果。目前它返回每个特定日期的计数。见下文:

这是我的控制器中的代码:

 public ActionResult About()
        
            IQueryable<EnrollmentDateGroup> data = from customer in db.Customers
                                                   group customer by customer.EnrollmentDate  into dateGroup

                                                   select new EnrollmentDateGroup()
                                                   
                                                       EnrollmentDate = dateGroup.Key,
                                                       CustomerCount = dateGroup.Count() 

        ;

谁能建议我如何计算每月注册的客户数量?

提前致谢。

更新

使用时出现如下错误:

group customer by new  customer.EnrollmentDate.Year, customer.EnrollmentDate.Month  into dateGroup

【问题讨论】:

group customer by new customer.EnrollmentDate.Year, customer.EnrollmentDate.Month 【参考方案1】:

您需要单独按月和年分组。当您传递完整日期时,它包含一个会打乱分组的日期组件。例如:

group customer by new  Year = customer.EnrollmentDate.Year, Month = customer.EnrollmentDate.Month 

更新

这是因为您要将密钥直接设置为您的 EnrollmentDate 属性,而密钥现在是匿名类型,而不是 DateTime。要么创建一个DateTime,要么做一些不同的事情。

EnrollmentDate = new DateTime(m.Key.Year, m.Key.Month, 1),

【讨论】:

【参考方案2】:

在 GROUPBY 子句中使用强制转换

GROUP BY CAST(MONTH(date) AS VARCHAR(2)) + '-' + CAST(YEAR(date) AS VARCHAR(4))

【讨论】:

这只适用于实际的SQL。这里的 OP 使用的是 LINQ to SQL,这是一个不同的野兽。【参考方案3】:

试试这个。

var result = from s in data
             group s by new  date = new DateTime(s.EnrollmentDate.Year, s.EnrollmentDate.Month, 1) into g 
select new 
date = g.Key.date,
Sum = g.Sum(x=>x.CustomerCount)
;

【讨论】:

我不确定您是否可以按新的DateTime 分组,因为它在技术上是不同的对象实例,但显然 group by 可以弥补这一点。但是,此时,无需将其包装在匿名对象中。就做group s by new DateTime(s.EnrollmentDate.Year, s.EnrollmentDate.Month, 1)

以上是关于按月分组计数的主要内容,如果未能解决你的问题,请参考以下文章

mysql 如何按月分组查询出当前年度每个月的短信数量(数据库中这个月要是为空的话就用0条怎么显示出来)

分组用户 - 按月累积计数

Pandas 数据透视表和分组按月和小时

按月分组的运行计数以汇总销售额

按月分组计数

将按月分组的行计数为列