首页 > 解决方案 > 在 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`;*

不会产生任何记录。

任何人都可以照亮为什么?

标签: sqlhavinghaving-clauseaggregates

解决方案


此查询格式错误:

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;

推荐阅读