获取一行中的表行

时间:2015-02-18 08:30:19

标签: sql sql-server sql-server-2012

我有第一个表(行数是可变的),我想创建第二个表。什么是有效的方式? enter image description here

2 个答案:

答案 0 :(得分:1)

首先,您必须将数据带入更友好的'格式:

;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

从这里开始,您必须使用动态查询来旋转获取的表for columnName in所有列名称的列表。我不会描述这个过程,因为它已经完成了很多次。看看这个答案:

Convert Rows to columns using 'Pivot' in SQL Server

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

答案 1 :(得分:0)

试试这个。我将每个列旋转,然后将它们连接在一起。

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