Sql 透视表,使所有值显示在同一行、多列中
我有以下疑问Sql 透视表,使所有值显示在同一行、多列中,sql,sql-server,sql-server-2005,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
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月,年份不重要,因为它已被过滤)显示为标题,并显示分子和分母的相应除法计算?类似的内容应该可以使用。我使用了
SUM()
进行聚合,但您可能希望使用AVG
或MIN
或MAX
,具体取决于您的业务逻辑
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
此外,在查询中使用列时,可能需要包含表别名。这会让事情变得更清楚。像这样的方法应该会奏效。我使用了
SUM()
进行聚合,但您可能希望使用AVG
或MIN
或MAX
,具体取决于您的业务逻辑
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
此外,在查询中使用列时,可能需要包含表别名。它使事情变得更清楚。如果使用
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
如果使用
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
你读了吗?你需要什么?是不是每个单位、月份、组合只有一行?我确实读过,我想这就是我想用的,我只是想了解如何使用。它是一行一个单位,一月至十二月。你读过吗?你需要什么聚合?是不是每个单位、月份、组合只有一行?我确实读过,我想这就是我想用的,我只是想了解如何使用。每单位1行,月份为1-12月。可能需要
Num*1.0/Denom ELSE 0.00
以避免整数运算,也可能需要转换以限制小数位数…嘘!我希望他能自己弄明白;)可能需要Num*1.0/Denom ELSE 0.00
来避免整数运算,也可能需要转换来限制小数位数…嘘!我希望他能自己弄明白;)