SQL объединить результаты в столбцах - PullRequest
0 голосов
/ 06 марта 2020

У меня есть стол Носителей и стол SKU . У владельца может быть несколько SKU, и когда они совпадают, я хочу увидеть этот результат. Традиционно я хотел бы показать результаты как это:

WEARER      SKU
------------------
Wearer 1    SKU 38    
Wearer 2    SKU 47
Wearer 2    SKU 75
Wearer 3    SKU 38
Wearer 7    SKU 47
Wearer 7    SKU 99

Однако, человек, запрашивающий этот запрос, хочет видеть это так:

WEARER      SKU 1     SKU 2    SKU 3    ...
-------------------------------------------
Wearer 1    SKU 38
Wearer 2    SKU 47    SKU 75
Wearer 3    SKU 38
Wearer 7    SKU 47    SKU 99

Итак, для каждого соответствующего SKU к Владелец, создайте столбец для этого SKU. Каков будет правильный метод такого стиля соединения в T- SQL (SQL Server)?

Некоторая информация:

  • У владельца не будет больше им назначено более 10 наименований.

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Если вы уверены, что оно не достигнет go более 10, то вы можете использовать условное агрегирование здесь:

;with tableA as
(select 'Wearer 1' as Wearer,'SKU 38' as SKU union
select 'Wearer 2','SKU 47' union
select 'Wearer 2','SKU 75' union
select 'Wearer 3','SKU 38' union
select 'Wearer 7','SKU 47' union
select 'Wearer 7','SKU 99')

select x.Wearer,
       MAX(CASE WHEN rownum1=1 then SKU end) as SKU_1,
       MAX(CASE WHEN rownum1=2 then SKU end) as SKU_2,
       MAX(CASE WHEN rownum1=3 then SKU end) as SKU_3,
       MAX(CASE WHEN rownum1=4 then SKU end) as SKU_4,
       MAX(CASE WHEN rownum1=5 then SKU end) as SKU_5,
       MAX(CASE WHEN rownum1=6 then SKU end) as SKU_6,
       MAX(CASE WHEN rownum1=7 then SKU end) as SKU_7,
       MAX(CASE WHEN rownum1=8 then SKU end) as SKU_8,
       MAX(CASE WHEN rownum1=9 then SKU end) as SKU_9,
       MAX(CASE WHEN rownum1=10 then SKU end) as SKU_10
from
(select a.*,
       row_number() over (partition by Wearer order by SKU) as rownum1
from tableA a) x
Group by x.Wearer

Надеюсь, это поможет.

0 голосов
/ 06 марта 2020

На всякий случай, если вы хотите попробовать подход PIVOT.

Пример

Select *
 From (
        Select WEARER
              ,SKU
              ,Col = concat('SKU ',row_number() over (partition by wearer order by SKU) )
         from YourTable
      ) src
 Pivot (max(SKU) for Col in ([SKU 1],[SKU 2],[SKU 3],[SKU 4],[SKU 5] ) ) pvt

Возвращает

WEARER      SKU 1   SKU 2   SKU 3   SKU 4   SKU 5
Wearer 1    SKU 38  NULL    NULL    NULL    NULL
Wearer 2    SKU 47  SKU 75  NULL    NULL    NULL
Wearer 3    SKU 38  NULL    NULL    NULL    NULL
Wearer 7    SKU 47  SKU 99  NULL    NULL    NULL

РЕДАКТИРОВАТЬ - Если вам не нужны значения NULL

Select WEARER
      ,[SKU 1] = concat('',[1])
      ,[SKU 2] = concat('',[2])
      ,[SKU 3] = concat('',[3])
      ,[SKU 4] = concat('',[4])
      ,[SKU 5] = concat('',[5])
 From (
        Select WEARER
              ,SKU
              ,Col = row_number() over (partition by wearer order by SKU) 
         from YourTable
      ) src
 Pivot (max(SKU) for Col in ([1],[2],[3],[4],[5] ) ) pvt
...