TSQL Group由两列组成,但结果为同一行

时间:2014-09-28 13:47:52

标签: sql-server tsql sql-server-2012

我在SQL Server 2012中有交易数据表,例如:

Month   Type  
-----   -----
1       Paper
1       Paper
1       Mobile
2       Mobile
3       Paper
3       Mobile

如果我按月分组,我可以轻松计算交易的发生次数:

SELECT Month, Count(*) 
FROM Transaction 
GROUP BY Month

如果我按月分组并输入:

SELECT Month, Type, Count(Type) AS RowCount 
FROM Transaction 
GROUP BY Month,Type

我可以分解结果并获得每种类型的计数。但是,结果显示在不同的行中:

Month  Type     RowCount
------  -----   ---------
1      Paper    2
1      Mobile   1
2      Mobile   1
3      Paper    1
3      Mobile   1

现在我真正需要的是知道是否可以通过一个查询生成以下结果:

Month    Paper    Mobile
-------  -------  --------
1        2        1
2        0        1
3        1        1

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

SELECT month,
SUM(CASE WHEN Type='Paper' THEN 1 ELSE 0 END) as Paper,
SUM(CASE WHEN Type='Mobile' THEN 1 ELSE 0 END) as Mobile
FROM t
GROUP BY month

答案 1 :(得分:1)

是的,您可以使用CASE语句和SUM来执行此操作:

Select
    Month,
    Sum(Case When Type = 'Paper'  Then 1 Else 0 End) As Paper,
    Sum(Case When Type = 'Mobile' Then 1 Else 0 End) As Mobile
From [transaction]
Group By Month

Sample SQL Fiddle

由于您使用的是SQL Server 2012,因此可以使用IIF语句使代码更紧凑:

SELECT 
    Month,
    SUM(IIF(TYPE='Paper',1,0)) AS Paper,
    SUM(IIF(TYPE='Mobile',1,0)) AS Mobile
FROM [Transaction]
GROUP BY Month

请注意,事务是您需要放在括号中的关键字。

如果您有更多类型,可以使用动态SQL为所有类型生成正确的代码。