如何使行作为SQL Server上的标题

时间:2019-05-01 02:50:00

标签: sql sql-server

我有一个如下表

    -------------------------------------
   | 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,然后将它们加入。我认为这根本不是最佳选择,但我一直无法找出更好的方法。

2 个答案:

答案 0 :(得分:1)

您可以尝试将条件聚合函数CASE WHENSUM一起使用

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:在客户端程序或报告工具中透视数据。运行您已经拥有的查询,让数据使用者担心其余的问题。这很困难的原因归结为形式关系集理论。您要求做的不仅是在传统集合论之外,而且与如何最好地使用关系直接对立,因此数据库引擎语言设计人员不愿意为这些操作构建简单的语法。