SQL Group By - 从单列生成多个聚合列

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)

  • 我发现第二个比第一个更具可读性 (2认同)