sql - 在 HAVING CLAUSE 中产生与 AVG(field) 相关的 NULL 值
问题描述
这是我的桌子:
有多个薪水低于 61,000。
相关表的 AVG Salary 为 61K。
如果我写一个查询:
SELECT `StaffID`, `Title`, `FirstName`, `LastName`, `DeptID`, `Salary`
FROM `Staff`
WHERE `Left` < '2018-00-00'
AND `ContractType` = 'Full time' *HAVING AVG(`Salary`) < `Salary`*;
它将产生一个结果,Salary 为 27000。61K 的 AVG Salary 不少于 27K。
如果我将同一查询中的比较运算符更改为:
*AVG(`Salary`) > `Salary`;*
不会产生任何记录。
任何人都可以照亮为什么?
解决方案
此查询格式错误:
SELECT StaffID, Title, FirstName, LastName, DeptID, Salary
FROM Staff
WHERE Left < '2018-00-00' AND ContractType = 'Full time'
HAVING AVG(Salary) < Salary;
这是一个聚合查询,因为它具有聚合功能AVG()
。但是,没有GROUP BY
,因此 中不应有未聚合的列SELECT
。也就是说,查询应该产生错误。
我只能假设您使用的数据库 - 遗憾的是 - 允许此类格式错误的查询。
你没有说你想做什么。特别是,where
条件是否适用于平均值。但是,一个好的解决方案使用窗口函数:
SELECT StaffID, Title, FirstName, LastName, DeptID, Salary
FROM (SELECT s.*, AVG(Salary) OVER () as avg_salary
FROM Staff s
WHERE Left < '2018-00-00' AND ContractType = 'Full time'
) s
WHERE salary > avg_salary;
推荐阅读
- mongodb - 在mongoose的顶部获取所选id的记录
- ios - 防止按钮在 SwiftUI 中被禁用时淡出
- wordpress - 填充样式未显示
- jetbrains-ide - 打开文件夹对话框冻结(JetBrains 产品)
- javascript - 简单的 forEach 返回未定义,我移动了一个 console.log 并且它可以工作 - 为什么?
- r - 更新 R 和 Rstudio 后双击文件“*.R”时出错
- python - 使用 %d 获得浮点数的两位小数
- javascript - React Hook 不更新
- vue.js - 如何使用 vuejs 路由保持 Laravel Auth 路由?
- python - Visual Studio Code 终端未激活 Conda 环境