SQL транспонировать полную таблицу
мне нужно сделать следующее транспонирование в MS SQL
from:
Day A B
---------
Mon 1 2
Tue 3 4
Wed 5 6
Thu 7 8
Fri 9 0
следующим образом:
Value Mon Tue Wed Thu Fri
--------------------------
A 1 3 5 7 9
B 2 4 6 8 0
Я понимаю, как это сделать с PIVOT
когда есть только один столбец (A), но я не могу понять, как это сделать, когда есть несколько столбцов для транспонирования (A, B,...)
пример кода для транспонирования:
select LEFT(datename(dw,datetime),3) as DateWeek,
sum(ACalls) as A,
Sum(BCalls) as B
from DataTable
group by LEFT(datename(dw,datetime),3)
Структура Таблицы:
Column DataType
DateTime Datetime
ACalls int
BCalls int
любая помощь будет высоко ценится.
1 ответов
для того, чтобы перенести данные в результат, который вы хотите, вы должны использовать UNPIVOT
и PIVOT
функции.
на принимает A
и B
столбцы и преобразует результаты в строки. Тогда вы будете использовать PIVOT
функция для преобразования day
значения в Столбцах:
select *
from
(
select day, col, value
from yourtable
unpivot
(
value
for col in (A, B)
) unpiv
) src
pivot
(
max(value)
for day in (Mon, Tue, Wed, Thu, Fri)
) piv
посмотреть SQL возиться с демо.
если вы используете SQL Сервер 2008+, то вы можете использовать CROSS APPLY
С VALUES
, чтобы отключить данные. Ваш код будет изменен на следующий:
select *
from
(
select day, col, value
from yourtable
cross apply
(
values ('A', A),('B', B)
) c (col, value)
) src
pivot
(
max(value)
for day in (Mon, Tue, Wed, Thu, Fri)
) piv
посмотреть SQL возиться с демо.
Edit #1, применяя ваш текущий запрос к вышеуказанному решению, вы будете использовать что-то подобное этому:
select *
from
(
select LEFT(datename(dw,datetime),3) as DateWeek,
col,
value
from DataTable
cross apply
(
values ('A', ACalls), ('B', BCalls)
) c (col, value)
) src
pivot
(
sum(value)
for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv