Транспонировать транзакционные данные в SQL и группировать по идентификатору пользователя - PullRequest
0 голосов
/ 14 января 2019

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

USER ID |   Transaction #  |   PRODUCT NAME |    Amount £
   1               1             Free Pass          0.00   
   1               2             Monthly Pass      10.00        
   1               3             Monthly Pass      10.00        
   2               1             Free pass          0.00   
   2               2             Year Pass        100.00
   3               1             Basic pass         5.00

Однако я хотел бы транспонировать данные, чтобы отобразить по одной строке для каждого идентификатора пользователя, и чтобы каждая транзакция отображалась горизонтально. Я надеялся на конечный результат в SQL:

USER ID |   Transaction 1 | Amount 1 |  Transaction 2 | Amount 2 |  Transaction 3 | Amount 3 | 
   1          Free Pass      0.00        Monthly Pass     10.00      Monthly Pass    10.00          
   2          Free Pass      0.00        Year Pass       100.00     
   3          Basic Pass     5.00

1 Ответ

0 голосов
/ 14 января 2019

Вы можете использовать conditional aggregation как

    with tab(USERID, Transaction#, PRODUCTNAME, Amount) as
    (
     select 1,1,'Free Pass'   ,  0 union all   
     select 1,2,'Monthly Pass', 10 union all       
     select 1,3,'Monthly Pass', 10 union all       
     select 2,1,'Free pass'   ,  0 union all   
     select 2,2,'Year Pass'   ,100 union all
     select 3,1,'Basic pass'  ,  5 
    )
    select [USERID],
           max(case when Transaction# = 1 then Productname end)
           as 'Transaction 1',
           max(case when Transaction# = 1 then Amount end)
           as 'Amount 1',
           max(case when Transaction# = 2 then Productname end)
           as 'Transaction 2',
           max(case when Transaction# = 2 then Amount end)
           as 'Amount 2',
           max(case when Transaction# = 3 then Productname end)
           as 'Transaction 3',
           max(case when Transaction# = 3 then Amount end)
           as 'Amount 3'               
      from tab t
     group by [USERID]

Rextester Demo

...