Это можно сделать в sqlserver следующим образом: это сочетание динамической сводной таблицы и создания временных таблиц.Возможно, есть более быстрый способ, но это работает.
Сначала создайте пример данных:
create table #t(dt datetime, v1 decimal(5,2), v2 decimal(5,2), v3 decimal(5,2))
insert #t values
('2018-01-11 00:01:00',1.22,2.22,34.12)
,('2018-01-11 00:02:00',2.22,3.22,43.12)
,('2018-01-11 00:03:00',1.22,2.22,54.12)
,('2018-01-11 23:58:00',1.22,2.22,34.12)
,('2018-01-11 23:59:00',1.22,2.22,34.12)
,('2018-01-12 00:01:00',1.55,5.55,34.15)
,('2018-01-12 00:02:00',5.55,3.55,43.15)
,('2018-01-12 00:03:00',1.55,5.55,54.15)
,('2018-01-12 23:58:00',1.55,5.55,34.15)
,('2018-01-12 23:59:00',1.55,5.55,34.15)
Затем транспонируйте столбцы в строки:
create table #t2(t varchar(5), dv varchar(13), v decimal(5,2))
insert #t2
select convert(varchar(5),convert(time,dt)) as t,
convert(varchar(10),convert(date,dt))+' ' + v as dv,
case when v='v1' then v1 when v='v2' then v2 when v='v3' then v3 end as v
from #t
cross join (values ('v1'),('v2'),('v3')) as v(v)
Затем работайтеиз списка столбцов (объединяя дату и значение в имя столбца)
DECLARE @cols AS VARCHAR(MAX)
select @cols=STUFF((SELECT distinct ',' + QUOTENAME(dv)
FROM #t2 c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
Затем создайте динамический запрос на основе этих столбцов
DECLARE @query AS VARCHAR(MAX);
set @query = 'SELECT t, ' + @cols + ' from
(
select t, dv, v
from #t2
) x
pivot
(
max(v)
for dv in (' + @cols + ')
) p '
execute(@query)
Результат: (столбцы фактически выровнены!)
t 2018-01-11 v1 2018-01-11 v2 2018-01-11 v3 2018-01-12 v1 2018-01-12 v2 2018-01-12 v3
00:01 1.22 2.22 34.12 1.55 5.55 34.15
00:02 2.22 3.22 43.12 5.55 3.55 43.15
00:03 1.22 2.22 54.12 1.55 5.55 54.15
23:58 1.22 2.22 34.12 1.55 5.55 34.15
23:59 1.22 2.22 34.12 1.55 5.55 34.15