sql - 透视不返回聚合 (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。
我究竟做错了什么?
解决方案
首先,计算的价值SalariedFlag
不会取得任何成果。COUNT
计算具有非值的行数NULL
,并且所有行都具有非NULL
值。相反,您想要COUNT
的值为 的行SalariedFlag
数1
。
因此,您可能SUM
能够进入该列,但是,因为它是一个“标志”,它更有可能是 abit
而您不能SUM
是 a bit
。因此,使用和COUNT
检查值可能会更好。1
CASE
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);
推荐阅读
- python-3.x - 错误:没有为 webdriver 找到匹配的发行版
- javascript - 如何在具有大型数据集的 JavaScript 中使用图表
- c# - 如何修复错误类型“IObjectContainer”都存在于两者中
- ruby-on-rails - 源代码中有图像标签时无法加载图像?
- react-native - React Native 打包器:如何同时拥有平台和视网膜后缀
- javascript - 在vue组件中导入promise时无法设置未定义的属性
- php - mysql 数据库错误:在 null 上调用成员函数 query()
- python - 如何在 Python 应用程序中存储和使用 300KB 的查找表?
- symfony - 使用 Symfony 和 Api 平台将带有子资源的实体保存到 redis
- python - 如何使 if else 在函数的 1 行中返回