mysql - 使用聚合函数 mySQL 时不断出现错误
问题描述
关于以下为什么不起作用的任何想法。该表称为收入,它有 3 个列,名称、部门和薪水。我想获取营销部门中薪水低于所有员工平均薪水的人员的姓名和薪水。当我运行以下命令时,我得到 ERROR 1111。
SELECT name, salary
FROM income
WHERE dept = "marketing"
HAVING salary < AVG(salary)
解决方案
作为将子查询放在 WHERE 子句中的替代方法,我们可以使用内联视图:
SELECT t.name
, t.salary
FROM ( SELECT AVG(d.salary) AS avg_salary
FROM income d
WHERE d.dept = 'marketing'
) a
JOIN income t
ON t.salary > a.avg_salary
AND t.dept = 'marketing'
使用内联视图,我们还可以返回平均工资,我们可以计算多个部门的差异,甚至是百分比差异
稍微扩展一下查询,如下所示:
SELECT a.dept
, t.name
, t.salary
, a.avg_salary
, ((t.salary - a.avg_salary) / a.avg_salary) * 100.0 AS pct_greater
FROM ( SELECT d.dept
, AVG(d.salary) AS avg_salary
FROM income d
GROUP
BY d.dept
) a
JOIN income t
AND t.dept = a.dept
ON t.salary > a.avg_salary
ORDER
BY a.dept
, t.salary DESC
推荐阅读
- java - 使用
在 AndroidManifest 文件中仅适用于特定设备 - django - django - 在视图中的变量中使用模板中的 url
- android - 如何在firebase中保存回收器视图的多个选中复选框?
- spring - 如何使用 spring boot 测试 flyway 迁移?
- apache-spark - Spark 通过安全的 YARN Hadoop 集群实现安全性
- c# - C# Parallel For 循环在完成后并不总是退出 [间歇性错误]
- php - PHP ip 计算 -> 来自 ipaddress 的段数组
- authentication - .NET Core 2 Api 与 Azure AD 和 Windows 身份验证
- javascript - contenteditable div 在光标位置设置 PX 字体大小
- javascript - 无法在js上将blob作为文本加载