Преобразование данных строки в столбцы в SQL Server - PullRequest
0 голосов
/ 07 мая 2019

У меня есть таблица с данными в следующем формате.

User ID| Date Paid  | Amount Paid
- - - - - - - - - - - - - - - - - 
1      | 2019-04-01 | 120
1      | 2019-03-01 | 120
1      | 2019-05-01 | 130
2      | 2019-03-01 | 100
2      | 2019-04-01 | 110
3      | 2019-05-01 | 100

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

User ID | 1st Date Paid | 1st Amount Paid | 2nd Date Paid | 2nd Amount Paid | 3rd Date Paid | 3rd Amount Paid | . . . . . 
- - - - - - - -  - - - - - -  - - - -- - - - - - --  -- - -  -- - - - - - - - 
   1    | 2019-03-01    | 120             | 2019-04-01    | 120             | 2019-05-01 | 130
   2    | 2019-03-01    | 100             | 2019-40-01    | 110             |
   3    | 2019-05-01    | 100             |

Может быть максимум 10 записей на пользователя, поэтому экспорт должен содержать столбцы с датой оплаты и суммой оплаты 10 раз. Если пользователь не содержит 10 записей, эти столбцы останутся пустыми.

Как лучше всего достичь этого результата?

1 Ответ

1 голос
/ 07 мая 2019

Вы можете использовать условное агрегирование:

select user_id,
       max(case when seqnum = 1 then date_paid end) as date_paid1,
       max(case when seqnum = 1 then amount_paid end) as amount_paid1,
       max(case when seqnum = 2 then date_paid end) as date_paid2,
       max(case when seqnum = 2 then amount_paid end) as amount_paid2,
       max(case when seqnum = 3 then date_paid end) as date_paid3,
       max(case when seqnum = 3 then amount_paid end) as amount_paid3
from (select t.*,
             row_number() over (partition by user_id order by date_paid) as seqnum
      from t
     ) t
group by user_id;
...