将行转换为超过2列SQL Server的列

时间:2016-10-24 09:35:03

标签: sql-server pivot

我想使用pivot将行转换为列。如果它只有两列,我们就可以做到。如果表格超过2列,我们是否可以进行转动?

例如:

    C1  C2      C3
________________________ 
    A   10      1000
    B   20      1000 
    C   30      1500

预期产出:

A         B        C
10        20       30
1000      1000     1500 

2 个答案:

答案 0 :(得分:0)

这是我发现的一种方式,即使你可以尝试使用一个支点而不是使用复杂的cte&#39>

WITH cte
         AS (SELECT Max(a) a,
                    Max(b) b,
                    Max(c) c
             FROM   (SELECT *
                     FROM   #Table1)a
                    PIVOT ( Avg(c2)
                          FOR c1 IN (a,
                                     b,
                                     c) ) AS c),
         c2
         AS (SELECT Max(a) a,
                    Max(b) b,
                    Max(c) c
             FROM   (SELECT *
                     FROM   #Table1)a
                    PIVOT ( Avg(c3)
                          FOR c1 IN (a,
                                     b,
                                     c) ) AS c3) SELECT *
    FROM   cte
    UNION ALL
    SELECT *
    FROM   c2 

答案 1 :(得分:0)

这是使用PIVOT和表值构造函数的简单方法

CREATE TABLE myTable
    ([C1] varchar(1), [C2] int, [C3] int)
;

INSERT INTO myTable
    ([C1], [C2], [C3])
VALUES
    ('A', 10, 1000),
    ('B', 20, 1000),
    ('C', 30, 1500)
;


SELECT  [A],[B],[C] 
FROM    (
        SELECT  ca.*
        FROM    myTable mt
                CROSS APPLY (VALUES(mt.C1, 1, mt.C2),(mt.C1, 2, mt.C3)) ca(col, rn, val)
        ) t
PIVOT (
    MAX(val)
    FOR col IN ([A],[B],[C])
) p

Cross Apply将为每列创建一个新行(C2,C3)col是C1值(A,B,C)rn只是一个RowNumber值来分隔值,所以PIVOT不会合并它们而只选择MAX而val只是C2和C3值