Thr*_*ian 5 sql-server grouping aggregate count sql-server-2008
我想按公司和日期进行分组,并为2个单独的值生成计数列(Flag = Y和Flag = N).输入表如下所示:
Company Date Flag
------- ------- -----
001 201201 Y
001 201201 N
001 201202 N
001 201202 N
001 201202 Y
Run Code Online (Sandbox Code Playgroud)
输出应如下所示:
Company Date Count_Y Count_N
------- ------ ------- -------
001 201201 1 1
001 201202 1 2
Run Code Online (Sandbox Code Playgroud)
我该如何编写SQL查询?任何形式的帮助表示赞赏!谢谢!
Mic*_*eyn 13
您可以使用相关的子查询来执行此操作:
SELECT
Company,
Date,
(SELECT COUNT(*) FROM MyTable AS T1
WHERE T1.Flag='Y' AND T1.Company=T2.Company AND T1.Date=T2.Date) AS Count_Y,
(SELECT COUNT(*) FROM MyTable AS T1
WHERE T1.Flag='N' AND T1.Company=T2.Company AND T1.Date=T2.Date) AS Count_N
FROM MyTable AS T2
GROUP BY Company, Date
Run Code Online (Sandbox Code Playgroud)
你也可以更简洁地做到这一点,但也许(可以说)使用这个SUM技巧的可读性稍差:
SELECT
Company,
Date,
SUM(CASE WHEN Flag='Y' THEN 1 ELSE 0 END) AS Count_Y,
SUM(CASE WHEN Flag='N' THEN 1 ELSE 0 END) AS Count_N,
FROM MyTable
GROUP BY Company, Date
Run Code Online (Sandbox Code Playgroud)
在Oracle/PLSQL中,该DECODE函数可用于替换CASE更简洁:
SELECT
Company,
Date,
SUM(DECODE(Flag,'Y',1,0)) AS Count_Y,
SUM(DECODE(Flag,'N',1,0)) AS Count_N,
FROM MyTable
GROUP BY Company, Date
Run Code Online (Sandbox Code Playgroud)