【问题标题】:Transpose group of rows into multiple columns将一组行转置为多列
【发布时间】:2019-05-10 12:54:03
【问题描述】:

我正在尝试将一组行转换为多列。

到目前为止,我已经能够使用 for xml 路径将一组行聚合到一个列中,但我需要将更多数据保存到更多列中。

CntTyp 表(联系人类型)

| ContactID | CatCode | CatDesc |
|-----------|---------|---------|
| 89        | 26      | OA      |
| 89        | 27      | OA2     |
| 90        | 26      | OA      |
| 91        | 26      | OA      |
| 91        | 1625    | Donor   |
| 91        | 1625    | Player  |

期望的输出

| ContactID | CatCode | CatDesc | CatCode | CatDesc | CatCode | CatDesc |
|-----------|---------|---------|---------|---------|---------|---------|
| 89        | 26      | OA      | 27      | OA2     |         |         |
| 90        | 26      | OA      |         |         |         |         |
| 91        | 26      | OA      | 1625    | Donor   | 234     | Player  |

我的代码:

select ContactID, catInfo = 
STUFF((select ','+cast(t1.CatCode as varchar) 
from CntTyp t1  where t.ContactID = t1.ContactID  
for xml path ('')), 1, 1, '')
from CntTyp t 
group by ContactID

我的输出

| ContactID | catInfo     |
|-----------|-------------|
| 89        | 26,27       |
| 90        | 26          |
| 91        | 26,1625,234 |

【问题讨论】:

    标签: sql sql-server database for-xml-path


    【解决方案1】:

    我们可以尝试在ROW_NUMBER 的帮助下进行数据透视查询:

    WITH cte AS (
        SELECT *,
            ROW_NUMBER() OVER (PARTITION BY ContactID ORDER BY CatCode, CatDesc) rn
        FROM CntTyp
    )
    
    SELECT
        ContactID,
        MAX(CASE WHEN rn = 1 THEN CatCode END) AS CatCode1,
        MAX(CASE WHEN rn = 1 THEN CatDesc END) AS CatDesc1,
        MAX(CASE WHEN rn = 2 THEN CatCode END) AS CatCode2,
        MAX(CASE WHEN rn = 2 THEN CatDesc END) AS CatDesc2,
        MAX(CASE WHEN rn = 3 THEN CatCode END) AS CatCode3,
        MAX(CASE WHEN rn = 3 THEN CatDesc END) AS CatDesc3
    FROM cte
    GROUP BY
        ContactID;
    

    【讨论】:

    • 我的数据集中的最高行数是 9,所以我已经处理了最大的函数,这很好用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-03-09
    • 2013-06-03
    • 2015-05-17
    相关资源
    最近更新 更多