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