SQL Server : преобразование таблицы умножения по горизонтали

#sql #sql-server #tsql

Вопрос:

У меня есть SQL Server и простая таблица, которая будет автоматически заполняться машинами учета рабочего времени:

 [time_id],[time_resource_id],[time_type],[time_date],[time_hour],[time_establishment]
     1          123               in     2021-06-19     8:00          1
     2          123               out    2021-06-19     10:00
     3          123               in     2021-06-19     13:00
 

Я хотел бы преобразовать это во что-то вроде

 time_resource_id,   time_date         t1 ,       t2     ,     t3
-------------------------------------------------------------------
123                2021-06-19         8:00      10:00       13:00
 

максимум до t8.

Как я могу этого достичь? Я думаю, что-то вроде поворота.

Спасибо

Комментарии:

1. Пожалуйста, покажите, что вы пробовали и где вы застряли.

Ответ №1:

Можно использовать row_number() и условную агрегацию:

 select time_resource_id, time_date,
       max(case when seqnum = 1 then time_hour end) as t1,
       max(case when seqnum = 2 then time_hour end) as t2,
       max(case when seqnum = 3 then time_hour end) as t3,
       max(case when seqnum = 4 then time_hour end) as t4,
       max(case when seqnum = 5 then time_hour end) as t5,
       max(case when seqnum = 6 then time_hour end) as t6,
       max(case when seqnum = 7 then time_hour end) as t7,
       max(case when seqnum = 8 then time_hour end) as t8
from (select t.*,
             row_number() over (partition by time_resource_id, time_date order by time_id) as seqnum
      from t
     ) t
group by time_resource_id, time_date