透视表使所有值显示在同一行,多列中

时间:2011-09-19 20:13:28

标签: sql sql-server sql-server-2005

我有以下查询

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月,年份无关紧要,因为它已经过滤)作为标题并显示分子和分母的相应分割计算?

2 个答案:

答案 0 :(得分: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

此外,您可能希望在查询中使用列时包含表别名。它使事情变得更加清晰。

答案 1 :(得分: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