首页 > 解决方案 > 透视不返回聚合 (SQL Adventureworks)

问题描述

我正在使用 Adventureworks 示例数据库(HumanResources.Employee表是数据库)。

为简单起见,我将抽取表格样本:

HireDate       Gender        SalariedFlag
-----------------------------------------
2014-01-01         M              1
2015-01-30         F              1
2014-01-30         M              1
2014-02-12         F              0
2014-03-11         F              1 and so on

代码:

SELECT
    YEAR(hiredate), F, M 
FROM
    HumanResources.employee
PIVOT
    (sum(SalariedFlag) 
         FOR gender IN ([F], [M])
    ) AS gg
  -- Unable to use sum though since its bit field

预期输出:

Year      F     M
-------------------
2014      1     2    # count(SalariedFlag) 
2015      1     0    # count(SalariedFlag)

但我真的得到:

No name     F               M
-------------------------------
2014         0              1
2015         1              0
2014         0              1
2014         1              0
2014         1              0 

等等。

所以基本上在输出中它根本不考虑salariedflag列,如果这个人是女性,它只是在 F 中返回 1,如果人是男性,它只是在 M 中返回 1。

我究竟做错了什么?

标签: sqlsql-server

解决方案


首先,计算的价值SalariedFlag不会取得任何成果。COUNT 计算具有非值的行数NULL,并且所有行都具有非NULL值。相反,您想要COUNT的值为 的行SalariedFlag1

因此,您可能SUM能够进入该列,但是,因为它是一个“标志”,它更有可能是 abit而您不能SUM是 a bit。因此,使用和COUNT检查值可能会更好。1CASE

PIVOT就个人而言,我建议您使用条件聚合,而不是使用限制性运算符。这为您提供以下信息:

SELECT YEAR(HireDate) AS HireYear,
       COUNT(CASE WHEN Gender = 'M' AND SalariedFlag = 1 THEN 1 END) AS M,
       COUNT(CASE WHEN Gender = 'F' AND SalariedFlag = 1 THEN 1 END) AS F
FROM #YourTable
GROUP BY YEAR(HireDate);

db<>小提琴


推荐阅读