【问题标题】:Group by several columns with count on another column SQL Server按几列分组并在另一列 SQL Server 上计数
【发布时间】:2018-12-19 09:49:04
【问题描述】:

我正在使用 SQL SERVER 2012,但我正在努力处理这个 SQL 语句。基本上我有这张桌子

table

我想按日期和用户名分组,并统计状态列,如下所示:

query result

我怎样才能做到这一点?

【问题讨论】:

标签: sql sql-server group-by count pivot


【解决方案1】:

您可以使用带有几个条件SUMs 的聚合查询。

SELECT 
    LastUpdate,
    UpdatedBy as User, 
    SUM(CASE WHEN Status = 'A' THEN 1 ELSE 0 END) as A
    SUM(CASE WHEN Status = 'C' THEN 1 ELSE 0 END) as C
    SUM(CASE WHEN Status = 'D' THEN 1 ELSE 0 END) as D
    SUM(CASE WHEN Status = 'Z' THEN 1 ELSE 0 END) as Z
    SUM(CASE WHEN Status = 'X' THEN 1 ELSE 0 END) as X
FROM table
GROUP BY LastUpdate, UpdatedBy
ORDER BY LastUpdate, UpdatedBy

【讨论】:

  • 谢谢,太好了。有没有办法根据日期分组调整这个。意思是,查询结果的第 1 行是用户 1 在 12 日的状态计数。第 2 行是用户 2 在 12 日的状态计数。第 3 行是 13 日等用户 1 的状态计数。
  • @DelHabington,不知道我明白你的意思...什么是第 12 行、第 13 行等等?
  • 很抱歉给您带来了困惑。当我说 12 日和 13 日时,我指的是日期。因此,第 1 行将是 2018 年 12 月 12 日,用户 1,以及所有状态的计数。第 2 行的日期相同,但对于 User2,以及所有状态的计数。并重复每一天。看我上传的查询结果图片澄清
  • 好的@DelHabington,所以你需要一个ORDER BY 子句,按日期然后按用户。我刚刚相应地更新了我的答案。
【解决方案2】:

您可以尝试使用条件聚合

select LastUpdate,UpdatedBy, 
count(case when Status='A' then UpdatedBy end) as 'A',
count(case when Status='C' then UpdatedBy end) as 'C',
count(case when Status='D' then UpdatedBy end) as 'D',
count(case when Status='Z' then UpdatedBy end) as 'Z',
count(case when Status='X' then UpdatedBy end) as 'X'
from tablename
group by LastUpdate,UpdatedBy

【讨论】:

    【解决方案3】:

    好的,我在朋友们的帮助下想通了

        SELECT 
        CAST(LastUpdate as DATE),
        UserName,
        SUM(CASE WHEN Status = 1 THEN 1 ELSE 0 END) as [Status_1],
        SUM(CASE WHEN Status = 2 THEN 1 ELSE 0 END) as [Status_2],
        SUM(CASE WHEN Status = 3 THEN 1 ELSE 0 END) as [Status_3]
    FROM Table
    WHERE LastUpdate BETWEEN '2018-11-30 10:013:44.080' AND '2018-12-30 10:013:44.080'
        GROUP BY CAST(LastUpdate as DATE), UserName
        ORDER BY CAST(LastUpdate as DATE)
    

    这是一个示例查询,我在其中查找两个日期之间的记录。我遇到的问题部分是由于过滤日期时间而不是日期。 lastupdate 列是一个日期时间,因此通过转换为日期它解决了问题

    【讨论】:

    • 确保您对帮助您解决问题的答案投赞成票
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 2014-06-17
    • 2011-08-30
    • 1970-01-01
    • 2019-08-11
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多