2013-03-08 56 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列和行?(HTTP可能重複:// stackoverflow.com/questions/13372276/simple-way-to-transpose-columns-and-rows-in-sql) – 2016-10-14 10:42:15

回答

22

爲了將數據轉置爲所需的結果,您需要同時使用UNPIVOTPIVOT函數。

UNPIVOT函數採用AB列,並將結果轉換爲行。然後,你將用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 APPLYVALUES來取消數據轉移。您的代碼將更改爲以下內容:

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

編輯#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

感謝您的快速回答。我不能設法爲以下查詢執行unpivot:select LEFT(datename(dw,datetime),3)作爲DateWeek,SUM(ACalls)作爲A,SUM(BCalls)作爲B from _online_interval_data組作爲LEFT(datename(dw ,datetime),3)Unpivot(=關鍵字'Unpivot'附近的語法不正確) – Selrac 2013-03-08 15:58:07

+0

我正在使用SQL2008 R2。與Cross應用相同的問題 - >選擇LEFT(datename(dw,datetime),3)作爲DateWeek,SUM(ACalls)作爲A, SUM(BCalls)作爲B從數據 group by LEFT(datename(dw,datetime ),3)交叉應用(=關鍵字'cross'附近的語法不正確) – Selrac 2013-03-08 16:05:44

+0

@ user2148939我不明白您發佈的代碼。請使用您的表格結構編輯原始文章,然後編輯您使用的代碼。 – Taryn 2013-03-08 16:07:41