2011-09-19 152 views
1

我有以下查詢透視表,以使所有值出現在同一行,多列

SELECT u.Unit, ut.Month, ut.Num , ut.Denom 
FROM Unit u 
INNER JOIN UnitTest ut ON u.Id = ut.UnitId 

這得出以下結果:

Unit Month Num Denom 
1  March 123 50 
1  April 325 60 
1  May  653 59 
2  March 656 68 
2  April 469 98 

而且更多的單位從比上月揚 - (分解)。

我將如何得到數據顯示爲這樣:

Unit Jan Feb March April May June.... 
1     2.46 5.41.............. 
2  ..................................... 

凡顯示月份(總是1至12月,一年也無所謂,因爲它已經被過濾)的標題和顯示分子和分母的分別計算?

+1

你讀過[使用PIVOT和UNPIVOT(http://msdn.microsoft.com/en-us/library/ms177410(V = SQL.90)的.aspx)? –

+0

你需要什麼樣的聚合? 「單位,月份」組合中是否只有一行? –

+0

我讀過,我認爲這就是我正在嘗試使用,我只是想了解如何。它是1行每單位月份1月至12月 – mameesh

回答

1

像這樣的東西應該工作。我已使用SUM()進行彙總,但您可能需要使用AVGMINMAX,具體取決於您的業務邏輯。

SELECT 
    Unit, 
    SUM(CASE Month WHEN 'Jan' THEN CAST(Num AS DECIMAL(10, 2))/Denom ELSE 0 END), 
    SUM(CASE Month WHEN 'Feb' THEN CAST(Num AS DECIMAL(10, 2))/Denom ELSE 0 END), 
    ... 
FROM 
    Unit U 
INNER JOIN UnitTest UT ON 
    U.Id = UT.UnitId 
GROUP BY 
    Unit 

此外,您可能希望在查詢中使用列時包含表別名。它使事情變得更清晰。

+0

可能希望'Num * 1.0/Denom ELSE 0.00'來避免整數運算,並且可能還有一個轉換以及限制小數位數...... –

+0

噓!我希望他能自己找出那一個;) –

0

如果使用PIVOT運算符,則需要在CTE /派生表中執行Num/Denom,然後再對其進行旋轉。

WITH T 
    AS (SELECT Unit, 
       [Month], 
       CAST(Num AS FLOAT)/Denom AS Val 
     FROM Unit u 
       INNER JOIN UnitTest ut 
        ON u.Id = ut.UnitId) 
SELECT * 
FROM T PIVOT (MAX(Val) FOR [Month] IN ([March], [April] /*...*/)) AS PVT