SQL Сводные строки в столбцы - PullRequest
0 голосов
/ 10 января 2020

У меня есть следующая таблица, и я пытаюсь повернуть ее так, чтобы для каждого элемента для каждого пользователя был создан новый столбец, но все пользователи сгруппированы в одну строку, например, если у пользователя больше всего элементов, то 4 4 элемента столбцов.

Я знаю, что мне нужно использовать Dynami cSQL и, возможно, функцию COALESCE, но, похоже, это не дает требуемого результата.

I нужно повернуть это:

UserName   UserId   ItemiD  ItemName
-----      ----     ------  --------
Bob         445       46     Hat
Bob         445       138    Tshirt
Rachel      512       46     Hat
Rachel      512       59     Mug
Rachel      512       138    Tshirt
Simon       771       46     Hat
Simon       771       400    MouseMat

В это:

UserName   UserId   Item1iD  Item1Name   Item2iD  Item2Name Item3iD  Item3Name
-----      ----     ------    --------   -------  --------  -------  --------
Bob         445       46        Hat       138      Tshirt     NULL      NULL
Rachel      512       46        Hat        59        Mug      138      Tshirt
Simon       771       46        Hat       400     MouseMat    NULL      NULL

Большое спасибо

1 Ответ

1 голос
/ 10 января 2020

Один способ, как вы могли бы сделать это ... хотя это не так красиво ....

Данные

If (OBJECT_ID('tempdb..#Test') IS NOT NULL) DROP TABLE #Test

create table #Test (UserName nvarchar(20), UserId int, ItemId int, ItemName nvarchar(20));

insert into #Test (UserName, UserId, ItemId, ItemName) 
values
('Bob', 445, 46, 'Hat'),
('Bob', 445, 138, 'Tshirt'),
('Rachel', 512, 46, 'Hat'),
('Rachel', 512, 59, 'Mug'),
('Rachel', 512, 138, 'Tshirt'),
('Simon', 771, 46, 'Hat'),
('Simon', 771, 400, 'MouseMat')

А вот запрос .... дать это выстрел, и дайте нам знать, если это поможет вам

Select UserName,
       UserId,
       MAX([11]) as "Item1",
       MAX([21]) as "ItemName1",
       MAX([12]) as "Item2",
       MAX([22]) as "ItemName2",
       MAX([13]) as "Item3",
       MAX([23]) as "ItemName3"
FROM  (Select UserName,
              UserId,
              ItemId,
              ItemName,
              Concat('1', Row_Number() over (partition by UserId order by UserId)) RN1,
              Concat('2', Row_Number() over (partition by UserId order by UserId)) RN2
       From #Test) as SRC
PIVOT ( MAX(ItemId) FOR RN1 IN ([11], [12], [13], [14]) ) as piv1
PIVOT ( MAX(ItemName) FOR RN2 IN ([21], [22], [23], [24])) as piv2
GROUP BY UserName,  UserId
...