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

T-SQL:将可变数量的行转换为列,sql,sql-server,pivot,coalesce,Sql,Sql Server,Pivot,Coalesce,当我运行一个SQL查询,返回一列,返回的行数可变时,我想将每一行转换为列值(我不介意列标题是什么) 例如 我想要一个脚本,可以将上面的内容转换为如下表: Col1 Col2 Col3 Col4 Col5 ------------------------ a b c d e (请注意,我不关心列名) 我知道我无法使用用户透视,因为行号不是固定的(它们基于SQL查询) 有什么想法吗 谢谢 您正在尝试调整结果,并在列名中包含一个计数器。因为我假设您不知道潜在的列数,所以需要使

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

例如

我想要一个脚本,可以将上面的内容转换为如下表:

Col1 Col2 Col3 Col4 Col5
------------------------
a    b    c    d    e
(请注意,我不关心列名)

我知道我无法使用用户透视,因为行号不是固定的(它们基于SQL查询)

有什么想法吗


谢谢

您正在尝试调整结果,并在列名中包含一个计数器。因为我假设您不知道潜在的列数,所以需要使用动态SQL来实现这一点

使用
行号
获取计数器时应关闭:

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)

可能的重复:一个简单的问题:您知道如何将execute(@query)的输出存储到临时表中吗?尝试了几种方法,但没有成功!非常感谢您的快速回复!我也试过了。我的execute(@query)返回大约600列。因此,当我执行temp表时,我得到错误消息:无法创建一个大小为14397的行,它大于允许的最大行大小8060。
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)