计数组和子组

时间:2011-12-06 13:16:19

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

我使用SQL Server 2008.有一个包含项目的表,它们的状态和日期:

ID    Status      Date
1     Gone        21-10-2011
2     Cancelled   01-10-2011
3     Won         02-10-2011
4     Won         07-10-2011
5     Gone        02-01-2010
6     Won         24-01-2010

出于统计目的,我需要一些T-SQL查询,结果将返回如下表:

Month    Year    Total    Lost   Won
10       2011    4        2      2
01       2010    2        1      1   

其中:

总数表示唯一月 - 月对的总条目金额。

Lost表示唯一的月份 - 年份对的总条目金额,状态为“已完成”或“已取消”

赢取是指具有状态“赢”的唯一月 - 月对的总条目金额。

我知道如何获得唯一月份年份的总金额,但不知道如何在结果集中添加Lost和Won列并获取条目金额。当然,如果没有任何“赢”项目的月 - 月对,只有'失去',它应该是赢得列的0值。

1 个答案:

答案 0 :(得分:8)

SELECT
   MONTH([Date]) [Month],
   YEAR([Date]) [Year],
   COUNT(*) [Total],
   COUNT(CASE WHEN Status IN ('Gone', 'Cancelled') THEN 1 END) [Lost],
   COUNT(CASE WHEN Status= 'Won' THEN 1 END) [Won]
FROM
   MyTable
GROUP BY
   MONTH([Date]),
   YEAR([Date])

这是有效的,因为CASE中的静默ELSE给出NULL,而COUNT将忽略此