【发布时间】:2018-12-19 09:49:04
【问题描述】:
我正在使用 SQL SERVER 2012,但我正在努力处理这个 SQL 语句。基本上我有这张桌子
我想按日期和用户名分组,并统计状态列,如下所示:
我怎样才能做到这一点?
【问题讨论】:
-
你的 dbms 是什么?
标签: sql sql-server group-by count pivot
我正在使用 SQL SERVER 2012,但我正在努力处理这个 SQL 语句。基本上我有这张桌子
我想按日期和用户名分组,并统计状态列,如下所示:
我怎样才能做到这一点?
【问题讨论】:
标签: sql sql-server group-by count pivot
您可以使用带有几个条件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
【讨论】:
ORDER BY 子句,按日期然后按用户。我刚刚相应地更新了我的答案。
您可以尝试使用条件聚合
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
【讨论】:
好的,我在朋友们的帮助下想通了
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 列是一个日期时间,因此通过转换为日期它解决了问题
【讨论】: