SQL Server可以在不知道结果列名的情况下进行Pivot吗?

时间:2010-01-31 00:17:46

标签: sql sql-server-2008 pivot

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

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和Google”进行硬编码 I saw one that didn't,但它基本上是通过列出网站并在运行中生成查询(连接字符串)来伪造它的。

有没有办法让SQL Server 2008在没有这样的黑客的情况下执行此操作?

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

谢谢!
丹尼尔

3 个答案:

答案 0 :(得分:6)

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

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

请注意,您实际上不需要编写生成动态SQL的SQL语句;你可以简单地在ASP.NET中生成SQL,这很可能会更容易。只是不要忘记在生成的查询中放弃它们之前逃避不同的Site值,并且不要忘记参数化没有数据透视表时通常会出现的SQL语句的任何部分。

答案 1 :(得分:0)

已经十多年了,同样的问题出现在我身上。

有什么方法可以在不知道列名的情况下进行数据透视吗?

然后我进行了搜索,找到了以下解决方案。我们可以通过使用动态查询来实现。我要添加它,这样对某人有帮助。

x,y

如您所见,我将列值放入字符串中,然后动态地使用它来进行旋转。

这是结果:

pixelation

答案 2 :(得分:-1)

选择月份,  min(个案网站'microsoft'then val end)microsoft,   min(案例网站'google'then val end)google  从没有透视  按月分组

 select main.month,
 m.val as microsoft,
 g.val as google
 from   withoutpivot main
 inner join withoutpivot m on m.month=main.month
 inner join withoutpivot g on g.month=main.month
 where  m.site='microsoft'
 and g.site='google'