Tsql将行转置为列,按列分组

时间:2017-12-07 15:46:41

标签: sql-server tsql

我有这组数据:

cId    item     value
-------------------------------------
1      A        string1
2      A        string2
3      A        string3
1      B        string4
2      B        string5
1      C        string6
3      C        string7

我会将item个广告cId行转换为列,以获得此结果:

cId        A           B             C
----------------------------------------------
1          string1     string4       string6  
2          string2     string5       NULL
3          string3     NULL          string7

itemcId行没有修复,所以我想我需要一些动态的sql来进行旋转。 我怎么能在tsql中做? 感谢

1 个答案:

答案 0 :(得分:1)

以下将会这样做:

DECLARE @pivotFields varchar(255) =
    STUFF(
        (
            SELECT ', [' + item + ']'
            FROM
                (
                    SELECT DISTINCT item
                    FROM YourTable
                ) Q
            ORDER BY item
            FOR XML PATH ('')
        )
        , 1, 2, ''
    )

DECLARE @sql varchar(1000) =
    '
        SELECT cId, ' + @pivotFields + '
        FROM
            (
                SELECT
                    cId
                    , item
                    , value
                FROM YourTable
            ) Q
            PIVOT
            (
                MAX(value)
                FOR item IN (' + @pivotFields + ')
            ) P
    '

EXEC (@sql)