当我运行一个SQL查询返回一个返回可变行数的列时,我想将每一行转换为列VALUE(我不介意列标题/标题是什么)。
E.g。
Column1
-------
a
b
c
d
e
我想要一个将上述内容转换为如下表格的脚本:
Col1 Col2 Col3 Col4 Col5
------------------------
a b c d e
(请注意,我不关心列名。)
我知道我不能使用PIVOT,因为行号没有修复(它们基于SQL查询)。
有什么想法吗?
谢谢!
答案 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)