我有一个如下表
-------------------------------------
| Date | EventName | Occurrences|
--------------------------------------
| 4/30/2019 | Party | 20 |
| 4/30/2019 | Reunion | 10 |
| 4/30/2019 | Auction | 5 |
| 4/30/2019 | Party | 10 |
| 4/30/2019 | Reunion | 10 |
--------------------------------------
如果我运行这样的查询
SELECT Date, EventName, SUM(Occurrences)
FROM [dbo].[Mytable]
GROUP BY Date, EventName
ORDER BY Date DESC
我得到的结果与此类似...
| Date | EventName | Occurrences|
--------------------------------------
| 4/30/2019 | Party | 30 |
| 4/30/2019 | Reunion | 20 |
| 4/30/2019 | Auction | 5 |
如何将行转换为列,使结果看起来像这样?
| Date | Party | Reunion | Auction |
------------------------------------------------
| 4/30/2019 | 30 | 20 | 5 |
我不知道如何将行转换为列,但是到目前为止,我尝试的是查询每个EventName,然后将它们加入。我认为这根本不是最佳选择,但我一直无法找出更好的方法。
答案 0 :(得分:1)
您可以尝试将条件聚合函数CASE WHEN
与SUM
一起使用
SELECT Date,
SUM(CASE WHEN EventName = 'Party' THEN Occurrences ELSE 0 END) Party,
SUM(CASE WHEN EventName = 'Reunion' THEN Occurrences ELSE 0 END) Reunion,
SUM(CASE WHEN EventName = 'Auction' THEN Occurrences ELSE 0 END) Auction
FROM [dbo].[Mytable]
GROUP BY Date
答案 1 :(得分:1)
SQL语言有一个非常严格的规则,您必须在开始执行查询之前,仅基于模式知道结果中的列数和类型 。直到查询开始检查数据后,您要查询的内容才知道。
如果您知道期望的列值,这仍然可能。在这种情况下,您可以使用条件聚合或有时使用PIVOT
语句...但是在两种情况下,您都必须指定所需的每一列以及手动进行该列所需的计算。如果您有很多结果列,那么编写和维护它们很快就会变得笨拙。
使用动态SQL 也可以做到这一点,您可以通过以下三个步骤来运行查询:首先,运行查询以获取所需的列名。其次,使用该信息来构建具有所需列的新查询字符串。第三,执行新的查询字符串。动态sql既危险又缓慢,因此仅在绝对必要时才应使用。
在大多数情况下,此处的正确答案是选项3:在客户端程序或报告工具中透视数据。运行您已经拥有的查询,让数据使用者担心其余的问题。这很困难的原因归结为形式关系集理论。您要求做的不仅是在传统集合论之外,而且与如何最好地使用关系直接对立,因此数据库引擎语言设计人员不愿意为这些操作构建简单的语法。