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

Posted

技术标签:

【中文标题】Tsql 将行转置为列,按列分组【英文标题】:Tsql transpose rows to columns, grouping by a column 【发布时间】:2017-12-07 15:46:40 【问题描述】:

我有这组数据:

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】:

下面会做:

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)

【讨论】:

以上是关于Tsql 将行转置为列,按列分组的主要内容,如果未能解决你的问题,请参考以下文章

mysql 将行转置为列

SQL 将行转置为列

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

SQL Server JSON 将行转置为列

Postgres 根据列值将行转置为列

CASE语句将行转置为列