问题描述
这是我的桌子:
61,000以下有多种薪金。
“相关的AVG薪金”表为61K。
如果我写查询:
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
);