在HAVING CLAUSE中产生与AVGfield相关的NULL值

问题描述

这是我的桌子:

Related Table

61,000以下有多种薪金。

“相关的AVG薪金”表为61K。

enter image description here

如果我写查询

SELECT `StaffID`,`Title`,`FirstName`,`LastName`,`DeptID`,`Salary` 
FROM `Staff` 
WHERE `Left` < '2018-00-00' 
AND `ContractType` = 'Full time' *HAVING AVG(`Salary`) < `Salary`*;

它将产生一个结果,薪金为27000。AVG薪金不少于61K。

如果将同一查询中的比较运算符更改为:

*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,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;
,

工作的子查询:

SELECT StaffID,Salary FROM Staff WHERE Left < '2018-00-00' 
AND ContractType = 'Full time' HAVING 'Salary' < 
(
    Select AVG(Salary) FROM Staff
);