如何按标准将数据汇总到多个不同的求和列中?

时间:2018-03-26 13:39:29

标签: sql sql-server aggregate

我的数据如下:

| DateTime         | Category | Total |
|------------------|----------|-------|
| 3/23/18 9:00 AM  | Bork     | 1     |
| 3/23/18 9:15 AM  | Arf      | 2     |
| 3/23/18 9:30 AM  | Bork     | 1     |
| 3/23/18 9:45 AM  | Arf      | 2     |
| 3/23/18 10:00 AM | Bork     | 1     |
| 3/23/18 10:15 AM | Arf      | 2     |
| 3/23/18 10:30 AM | Bork     | 1     |
| 3/23/18 10:45 AM | Arf      | 2     |
| 3/23/18 11:00 AM | Bork     | 1     |
| 3/23/18 11:15 AM | Arf      | 2     |
| 3/23/18 11:30 AM | Bork     | 1     |
| 3/23/18 11:45 AM | Arf      | 2     |
| 3/23/18 12:00 PM | Bork     | 1     |
| 3/23/18 12:15 PM | Arf      | 2     |
| 3/23/18 12:30 PM | Bork     | 1     |
| 3/23/18 12:45 PM | Arf      | 2     |

我希望按小时计算,并将类别分开,如下所示:

| Hour | Borks | Arfs |
|------|-------|------|
| 9    | 2     | 4    |
| 10   | 2     | 4    |
| 11   | 2     | 4    |
| 12   | 2     | 4    |

我知道如何按小时汇总数据......我使用这样的查询:

SELECT DatePart("h", DateTime), SUM(Total)
FROM Events
GROUP BY DatePart("h", DateTime), DateAdd("d", 0, DateDiff("d", 0, DateTime))

但是如何将类别汇总到单独的列中,以及如何命名输出中的列呢?

此外,即使源中没有数据,如何确保结果中的所有小时数都已显示?例如,它将列出小时,总数= 0.

1 个答案:

答案 0 :(得分:2)

在类别上使用透视:

SELECT
    DatePart(hour, DateTime),
    SUM(CASE WHEN Category = 'Bork' THEN Total ELSE 0 END) AS Borks,
    SUM(CASE WHEN Category = 'Arf'  THEN Total ELSE 0 END) AS Arfs
FROM Events
GROUP BY DatePart(hour, DateTime)
ORDER BY MIN(DateTime);

另请注意,您当前的GROUP BY可能不是您想要的。如果要报告小时组,请仅按小时分组。