Транспонировать группу строк в несколько столбцов - PullRequest
0 голосов
/ 10 мая 2019

Я пытаюсь переместить группу строк в несколько столбцов.

Пока я смог объединить группу строк в один столбец, используя путь XML, но мне нужно сохранить дополнительные данные в большем количестве столбцов.

CntTyp table (тип контакта)

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

1 Ответ

4 голосов
/ 10 мая 2019

Мы можем попробовать выполнить сводный запрос с помощью 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;
...