2011-09-19 23 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 
相关问题