【问题标题】:TSQL Group by two columns but result in the same rowSQL 按两列分组,但结果是同一行
【发布时间】:2014-09-28 22:15:59
【问题描述】:

我在 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

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

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

有什么想法吗?

【问题讨论】:

  • 纸和手机是你仅有的两种类型吗?

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


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    是的,您可以使用 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
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-12
      相关资源
      最近更新 更多