T-SQL:将可变行数转换为列

时间:2013-06-25 02:20:09

标签: sql sql-server pivot coalesce

当我运行一个SQL查询返回一个返回可变行数的列时,我想将每一行转换为列VALUE(我不介意列标题/标题是什么)。

E.g。

Column1
-------
a
b
c
d
e

我想要一个将上述内容转换为如下表格的脚本:

Col1 Col2 Col3 Col4 Col5
------------------------
a    b    c    d    e

(请注意,我不关心列名。)

我知道我不能使用PIVOT,因为行号没有修复(它们基于SQL查询)。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

您正在尝试透视结果,并在列名中包含一个计数器。由于我假设您不知道可能的列数,因此您需要使用Dynamic SQL来实现此目的。

应该使用ROW_NUMBER关闭以获取计数器:

declare @cols AS NVARCHAR(MAX), 
        @colswithalias AS NVARCHAR(MAX), 
        @query  AS NVARCHAR(MAX)

set @colswithalias = STUFF((SELECT distinct ',' + QUOTENAME(col1) 
                          + ' AS Col' 
                          + CAST(ROW_NUMBER() OVER (ORDER BY col1) as varchar(10))
                      FROM yourtable 
                      FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @cols = STUFF((SELECT distinct ',' + QUOTENAME(col1)
                      FROM yourtable 
                      FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT ' + @colswithalias + '
             from 
             (
                select col1 rn, col1
                from yourtable
            ) x
            pivot 
            (
                max(rn)
                for col1 in (' + @cols + ')
            ) p '

execute(@query)