一尘不染

SQL Server Pivot是否可以不知道结果列名称?

sql

我有一个看起来像这样的表:

Month      Site          Val
2009-12    Microsoft      10
2009-11    Microsoft      12
2009-10    Microsoft      13
2009-12    Google         20
2009-11    Google         21
2009-10    Google         22

我想获得一个二维表,该表为我提供每个站点月份的“ Val”,例如:

Month      Microsoft      Google
2009-12        10           20
2009-11        12           21
2009-10        13           22

但是要注意的是,我不知道“站点”中所有可能的值。如果出现一个新站点,我想在结果表中自动获得一个新列。

我看到的所有可以做到这一点的代码示例都要求我在查询文本中对“ Microsoft and Google”进行硬编码。
我看到了一个没有,但是基本上是通过列出站点并在其中生成带有这些列名称的查询(连接字符串)来伪造它。

没有这样的黑客,没有办法让SQL Server 2008做到这一点吗?

注意:我需要能够将其作为从ASP.Net发送的查询来运行,我无法执行存储过程或类似的其他工作。

谢谢!
丹尼尔


阅读 171

收藏
2021-03-10

共1个答案

一尘不染

您链接到的示例使用动态SQL。不幸的是,当事先不知道输出列时,没有其他内置方法可以在SQL Server中进行透视。

如果数据不是太大,则可能最简单的是简单地从ASP.NET运行普通的行查询并在应用程序代码中执行数据透视。如果数据非常大,则必须在首先查询可能的列值之后动态生成SQL。

请注意,您实际上不需要编写生成动态SQL的SQL语句。您可以简单地在ASP.NET中生成SQL,这很可能会容易得多。只是不要忘记Site在生成的查询中将它们分开之前先转义不同的值,也不要忘记对SQL语句的任何部分进行参数化,而这些部分通常是您无需数据透视表即可实现的。

2021-03-10