在 1 行中获取 table 的行

get the rows of a table in 1 row

我有第一个 table(行数可变),我想创建第二个 table。什么是有效的方法?

试试这个。我旋转了每一列,然后将它们连接成一行。

SELECT aa1,bb1,cc1,aa2,bb2,cc2,aa3,bb3,cc3 FROM
    (SELECT 1 id,[2]aa1,[3]aa2,[4]aa3 FROM(SELECT aa FROM tablea) AS A
    PIVOT(SUM(aa) FOR aa in([2],[3],[4])) AS pvt) A 
INNER JOIN
    (SELECT 1 id,[400]bb1,[200]bb2,[500]bb3 FROM(SELECT bb FROM tablea) AS A
    PIVOT(SUM(bb) FOR bb in([400],[200],[500])) AS pvt) B ON A.id=B.id
INNER JOIN
    (SELECT 1 id,[20]cc1,[25]cc2,[20]cc3 FROM(SELECT cc FROM tablea) AS A
    PIVOT(MIN(cc) FOR cc in([20],[25])) AS pvt) C ON B.id=C.id

首先,您必须将数据转换为更“友好”的格式:

;with 
data as
(
    -- replace this with your select
    select * from 
    (
        VALUES ('1', 'a', 'b'),
               ('2', 'c', 'd'),
               ('3', 'e', 'f')
    ) as data(aa,bb,cc)
    --------------------------------
),
dataAsXml as
(
    select CAST(STUFF((SELECT '<i>' + d.[aa] + '</i><i>' + d.[bb] + '</i><i>' + d.[cc] + '</i>' FROM data d FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'),1,0,'') as XML) as data
),
dataAsList as
(
        select  x.i.value('for $i in . return count(../*[. << $i]) + 1', 'int') as 'Ord',
                x.i.value('.', 'NVARCHAR(100)') AS 'Value'
        from    dataAsXml
                CROSS APPLY [data].nodes('//i') x(i)
),
normalized AS
(
    select
        case (Ord - 1) % 3 + 1
            when 1 then 'aa'
            when 2 then 'bb'
            when 3 then 'cc'
        end  + cast((Ord - 1) / 3 + 1 as varchar(10)) as columnName, --fix here
        value
    from dataAsList
)
select * from normalized

在上面的查询中,您可以在 data CTE 中插入您的数据以查看结果。 输出将有两列,一列存储您的列名,一列包含值。

SQL Fiddle

从这里开始,您必须使用一个动态查询,在其中对获得的 table for columnName in 所有列名称的列表进行透视。这个过程我就不描述了,因为已经做过很多次了。看看这个答案:

Convert Rows to columns using 'Pivot' in SQL Server

注意: 我没有用大量数据测试这种方法的性能,但是 从某些角度来看,它是有效的。