首页 > 解决方案 > MySQL - GROUP BY 和 HAVING 来确定支出

问题描述

根据我之前的一些问题,我正在使用next.tech 课程学习 MySQL,该课程依赖于以下模式

课程的下一步是确定是否有员工在两个项目上超支:

对于这两个项目,Central Valley Hospital 项目和 Big Money Bank 项目,我要回报:

我已经编写了以下查询,但得到了之后重现的错误消息。我已尝试对查询进行故障排除,但不了解此错误的原因,也不了解我的查询中是否还有其他需要调整的错误:

SELECT p.name AS 'Project Name',
       e.first_name AS 'First Name',
       e.last_name  AS 'Last Name',
       SUM(jo.quantity) * SUM(jo.price) AS 'Spending'
FROM projects p
JOIN job_orders jo ON p.id = jo.project_id
JOIN employees e ON p.id = e.id
GROUP BY  1
HAVING 'Spending' > 10000000
ORDER BY  4 DESC
LIMIT  2;

第 1 行的错误 1055 (42000):SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列“codeys_construction.e.first_name”;这与 sql_mode=only_full_group_by 不兼容

标签: mysqlsql

解决方案


你不会得到结果(或者可能是错误的结果),因为 JOIN employees e ON p.id = e.id 不正确,项目和员工之间没有直接关系。通过在加入员工之前向 project_employees 添加另一个连接来添加该关系,或者因为 project_employees 是多余的,所以将员工加入到 job_orders。正如在另一个答案中提到的,您的分组依据应该包括选择语句中的所有非聚合字段。同样为了可读性,您应该使用列名而不是枚举列。


推荐阅读