Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 透视表,使所有值显示在同一行、多列中_Sql_Sql Server_Sql Server 2005 - Fatal编程技术网

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
来避免整数运算,也可能需要转换来限制小数位数…嘘!我希望他能自己弄明白;)