2010-06-30 61 views
2

比方說,我有一個表是這樣的:SQL數據透視表 - 複製Excel功能

 
Task Type Variable Hours Duration 
One A  X   10  5 
One A  Y   40  15 
One B  X   100  29 
Two A  X   5  2 
Two B  X   15  9 
Two A  Y   60  17 
Three A  Y   18  5 

當任務型變量的組合使得每一行都是唯一的。

我怎樣才能得到類似下面的數據透視表:

 
          X  Y 
One  A  Hours  10  40 
       Duration  5  15 
One  B  Hours  100  0  
       Duration  29  0 
Two  A  Hours  5  60 
       Duration  2  17 
Two  B  Hours  15  0 
       Duration  9  0 
Three A  Hours  0  18 
       Duration  0  5 

這甚至可能在SQL?我知道Excel可以做到這一點。

回答

1

這實在是一個UNPIVOT和一個PIVOT。以下代碼在單個查詢中獲得所需的結果。

DECLARE @t TABLE (
    Task  varchar(5), 
    Type  char(1), 
    Variable char(1), 
    Hours int, 
    Duration int 
    ) 

INSERT INTO @t 
    VALUES 
     ('One', 'A', 'X', 10, 5), 
     ('One', 'A', 'Y', 40, 15), 
     ('One', 'B', 'X', 100, 29), 
     ('Two', 'A', 'X', 5, 2), 
     ('Two', 'B', 'X', 15, 9), 
     ('Two', 'A', 'Y', 60, 17), 
     ('Three', 'A', 'Y', 18, 5) 

SELECT 
     P.Task, 
     P.Type, 
     CAST(P.Property AS varchar(8)) AS Property, 
     COALESCE(P.X, 0) AS X, 
     COALESCE(P.Y, 0) AS Y 
    FROM @t AS T 
    UNPIVOT (
     Value FOR Property IN (
      Hours, 
      Duration 
      ) 
     ) AS U 
    PIVOT (
     SUM(Value) FOR Variable IN (
      X, 
      Y 
      ) 
     ) AS P 

這產生以下結果。

Task Type Property X   Y 
----- ---- -------- ----------- ----------- 
One A Duration 5   15 
One A Hours 10   40 
One B Duration 29   0 
One B Hours 100   0 
Three A Duration 0   5 
Three A Hours 0   18 
Two A Duration 2   17 
Two A Hours 5   60 
Two B Duration 9   0 
Two B Hours 15   0 

正如你所看到的,小時和持續時間是翻轉的。我認爲沒有辦法單獨使用PIVOT強制執行訂單。只要您有其他方法確保其他列首先正確排序,則可以通過將Property值與相關聯的排序順序連接到另一個表來加以解決。