Строковые данные SQL Pivot - PullRequest
       6

Строковые данные SQL Pivot

0 голосов
/ 13 декабря 2018

У меня есть таблицы в SQL Server: Продукт

Таблица продуктов :

ImageID  ProductID  
-------  ---------- 
1           P1
1           P2             
1           P3             
2           S1
2           S2
2           S3
3           M1

Это вывод, который мне нужен:

ImageID  Product1ID     Product2ID      Product3ID
----------- ---------- ----------    ----------
1           P1             P2           P3
2           S1             S2           S3
3           M1             null         null

У ImageID может быть максимум 3 ProductID. Не обязательно, чтобы у всех ImageID было 3 продукта [например.ImageID = 3]

SELECT ImageID, [Product1ID], [Product2ID], [Product3ID]
FROM    
(  
        SELECT ImageID,  ProductID
        FROM ProductTable
) AS P
PIVOT 
(  
    max( ImageID) 
    FOR ProductID IN ([Product1ID], [Product2ID], [Product3ID])
) AS  PVT

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я бы просто использовал условное агрегирование:

SELECT ImageID,
       MAX(CASE WHEN seqnum = 1 THEN ProductID END) as Product1ID,
       MAX(CASE WHEN seqnum = 2 THEN ProductID END) as Product2ID,
       MAX(CASE WHEN seqnum = 3 THEN ProductID END) as Product3ID
FROM (SELET pt.*, ROW_NUMBER() OVER (PARTITION BY ImageId ORDER BY ProductID) as seqnum
      FROM ProductTable
     ) P
GROUP BY ImageID;

Основная идея, однако, заключается в использовании ROW_NUMBER() для перечисления продуктов.

0 голосов
/ 13 декабря 2018

Вы были очень близки, вам просто нужно включить Row_Number ()

Пример

Select *
 From  (
        Select ImageID
              ,Item = concat('Product',row_number() over (partition by ImageID order by ProductID),'ID') 
              ,ProductID
         From ProductTable
       ) src
Pivot (max(ProductID) for Item in ([Product1ID], [Product2ID], [Product3ID])) pvt
...