2013-03-08 3 views
13

мне нужно сделать следующее транспонировать в MS SQLSQL транспонирования полная таблица

от:

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 

Любая помощь будет высоко ценится.

+0

Возможного дубликат [Простой способ транспонировать столбцы и строки в SQL Server?] (Http: // stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql) –

ответ

22

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

Функция UNPIVOT принимает столбцы 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 Fiddle with Demo.

Если вы используете SQL Server 2008+, вы можете использовать CROSS APPLY с VALUES, чтобы отключить данные. You код будет изменен следующим образом:

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 Fiddle with Demo.

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 
+0

Спасибо за быстрый ответ. Я не могу сделать univot для следующего запроса: выберите LEFT (datename (dw, datetime), 3) как DateWeek, SUM (ACalls) как A, SUM (BCalls) как B из группы _online_interval_data с помощью LEFT (datename (dw) , datetime), 3) Unpivot (= Неверный синтаксис рядом с ключевым словом «Unpivot») – Selrac

+0

Я использую SQL2008 R2. Аналогичная ошибка проблемы с применением Cross -> выберите LEFT (имя_данных (dw, datetime), 3) как DateWeek, SUM (ACalls) как A, SUM (BCalls) как B из данных группа по LEFT (имя_данных (dw, datetime), 3) cross apply (= Неверный синтаксис рядом с ключевым словом «cross») – Selrac

+0

@ user2148939 Я не понимаю этот код, который вы разместили. Измените исходное сообщение с помощью структуры таблицы, а затем кода, который вы используете. – Taryn