【问题标题】:How can I do a group by on rows with a day of month for each in the group?如何在组中的每个月的某一天对行进行分组?
【发布时间】:2017-02-28 17:13:06
【问题描述】:

我有这张表 DDL:

CREATE TABLE [dbo].[Audit] 
(
    [AuditId] INT          IDENTITY (1, 1) NOT NULL,
    [Entity]  INT          NOT NULL,
    [UserId]  INT          NOT NULL,
    [Note]    VARCHAR(200) NULL,
    [Date]    DATETIME     NOT NULL,
    [Action]  INT          NOT NULL,

    CONSTRAINT [PK_Audit] 
        PRIMARY KEY CLUSTERED ([AuditId] ASC)
);

我想做的是获得一份报告,该报告按天显示单个 UserId 的活动(行)计数。

这是否可能与 LINQ 相关,或者我是否需要使用 SQL 编码,因为需要以某种方式从 DATETIME 字段中提取日期。

即使是 SQL SELECT 也会非常感谢您对此提供一些帮助和建议。

Date          Count
---------------------    
29-Feb-2018   25
28-Feb-2018   33
27-Feb-2018   11
26-Feb-2018   44

【问题讨论】:

    标签: sql-server entity-framework linq entity-framework-4


    【解决方案1】:

    您应该避免使用关键字作为列名或对象名,因为这会使事情变得非常混乱。但是使用您的示例,这是一个非常简单的查询。

    select [Date] = convert(date, a.Date)
        , [Count] = count(*)
    from Audit a
    group by convert(date, a.Date)
    

    【讨论】:

    • 谢谢。如果我想按日期降序排列,我可以在 group by a.Date 语句之后放一个 orderby 吗?
    • 我检查了这个,但它没有正确分组,因为有数千个不同的日期(不是整个日期)。我认为 group by 必须也使用转换后的日期。
    【解决方案2】:

    假设您的 EF 模型看起来像表格,您可以使用以下 LINQ 语句:

    from a in context.Audits
    group a by EntityFunctions.TruncateTime(a.Date) into grp
    select new
    {
        Date = grp.Key,
        Count = grp.Count()
    }
    

    由于您标记了实体框架 4,因此您必须使用EntityFunctions。这在以后的版本中改为DbFunctions

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 1970-01-01
      • 2014-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多