SQL Server是否可以在不知道结果列名的情况下透视?

SQL Server是否可以在不知道结果列名的情况下透视?,sql,sql-server-2008,pivot,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

我有一张这样的桌子:

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”。
,但它基本上是通过列出站点并动态生成一个包含这些列名的查询(用字符串括起来)来伪装的

难道没有办法让SQLServer2008不用那样的黑客就可以做到这一点吗

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

谢谢

Daniel

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

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


注意,实际上不需要编写生成动态SQL的SQL语句;您可以简单地在ASP.NET中生成SQL,这很可能会容易得多。在生成查询之前,不要忘记转义不同的
站点
值,也不要忘记参数化SQL语句的任何部分,如果没有pivot,通常都会这样做。

十多年了,我也遇到了同样的问题

select 
    month,
    min(case site  when 'microsoft'then val end) microsoft,
    min(case site  when 'google'then val end) google
from 
    withoutpivot
group by 
    month

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'
有没有办法在不知道列名的情况下进行透视

然后我搜索了一些东西,找到了下面的解决方案。我们可以通过使用动态查询来实现这一点。我加上这个是为了帮助别人

CREATE TABLE TEMP 
(
     [Month] varchar(50),
     [Site] varchar(50),
     Val int
)

INSERT INTO TEMP
VALUES ('2009-12', 'Microsoft', 10),
       ('2009-11', 'Microsoft', 12),
       ('2009-10', 'Microsoft', 15),
       ('2009-12', 'Google', 20),
       ('2009-11', 'Google', 8),
       ('2009-10', 'Google', 11),
       ('2009-12', 'Facebook', 13),
       ('2009-11', 'Facebook', 12),
       ('2009-10', 'Facebook', 5)

DECLARE @Columns as VARCHAR(MAX)

SELECT @Columns = COALESCE(@Columns + ', ','') + QUOTENAME([Site])
FROM
    (SELECT DISTINCT [Site] FROM TEMP) AS B
ORDER BY B.[Site]

DECLARE @SQL as VARCHAR(MAX)
SET @SQL = 'SELECT Month, ' + @Columns + ' 
FROM
(
 select Month,[Site],Val from TEMP
) as PivotData
PIVOT
(
   Sum(Val)
   FOR [Site] IN (' + @Columns + ')
) AS PivotResult
ORDER BY Month'


EXEC(@SQL);
如您所见,我将列值转换为字符串,然后动态地使用该字符串来透视

结果如下:


在运行时使用
exec(@sql)
see执行查询应该可以实现您所要查找的内容。已经10年了,是否还可以在不知道列名的情况下进行透视?