SQL Server 2014:一列到行数较少的多列,如何旋转 table?

SQL Server 2014: one column to multiple columns with less rows, how to pivot a table?

我想将一列拆分为多列并合并一些列。如何在 SQL Server 2012 中进行修改?

输入

|   Cust   |    Q     |    Val     |
------------------------------------
|    1     |    1     |    10      |
|    2     |    2     |    20      |
|    1     |    2     |    30      |
|    4     |    4     |    40      |
|    4     |    1     |    400     |
|    4     |    2     |    4000    |

输出:如何从输入得到这里?

|   Cust   |   ValQI  |   ValQII   |   ValQIII   |    VALQIV    |
-----------------------------------------------------------------
|    1     |    10    |    30      |             |              |
|    2     |          |    20      |             |              |
|    3     |          |            |             |              |
|    4     |    400   |    4000    |             |      40      |

您可以在 SQL 服务器中使用 pivot 在 SQL 服务器中像这样转置数据..

;with cte as (
select cust, RowN = Row_Number() over (partition by cust order by q), val from #yourPivot )
select * from cte
pivot (max(val) for RowN in ([1],[2], [3],[4])) p

您的输入table:

create table #yourPivot (cust int, Q int, Val int)

insert into #yourPivot (cust, q, val) values
 (   1    ,   1     ,    10      )
,(   2    ,   2     ,    20      )
,(   1    ,   1     ,    30      )
,(   4    ,   4     ,    40      )
,(   4    ,   1     ,    400     )
,(   4    ,   2     ,    4000    )

组合 PIVOT 和 LEFT OUTER JOIN

WITH C AS
(
    SELECT *
    FROM (VALUES (1), (2), (3), (4)) AS T(Cust)
)
SELECT C.Cust, [1] AS ValQI, [2] AS ValQII, [3] AS ValQIII, [4] AS ValQIV
FROM C
LEFT OUTER JOIN 
(
    SELEcT *
    FROM 
    (VALUES 
        (1, 1, 10), 
        (2, 2, 20), 
        (1, 2, 30), 
        (4, 4, 40), 
        (4, 1, 400), 
        (4, 2, 4000)
    ) AS T(Cust, Q, Val)
    PIVOT (MAX([Val]) FOR [Q] IN ([1], [2], [3], [4])) AS P
) AS TT ON C.Cust = TT.Cust