mysql - MySQL - GROUP BY 和 HAVING 来确定支出
问题描述
根据我之前的一些问题,我正在使用next.tech 课程学习 MySQL,该课程依赖于以下模式:
课程的下一步是确定是否有员工在两个项目上超支:
对于这两个项目,Central Valley Hospital 项目和 Big Money Bank 项目,我要回报:
- 项目名称,如“项目名称”
- 参与该项目的员工的名字和姓氏,如“First Name”和“Last Name”,
- 他们的总支出(即他们的工作订单的成本),作为“支出”,以及
- 将结果筛选给在任一项目上花费超过 10,000,000 美元的员工,并按成本从高到低排序结果。
我已经编写了以下查询,但得到了之后重现的错误消息。我已尝试对查询进行故障排除,但不了解此错误的原因,也不了解我的查询中是否还有其他需要调整的错误:
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 不兼容
解决方案
你不会得到结果(或者可能是错误的结果),因为 JOIN employees e ON p.id = e.id 不正确,项目和员工之间没有直接关系。通过在加入员工之前向 project_employees 添加另一个连接来添加该关系,或者因为 project_employees 是多余的,所以将员工加入到 job_orders。正如在另一个答案中提到的,您的分组依据应该包括选择语句中的所有非聚合字段。同样为了可读性,您应该使用列名而不是枚举列。
推荐阅读
- ios - 使用 moveItemAtURL 时 sqlite 文件中的数据丢失
- javascript - foo(123) 和 window["foo"](123) 之间有性能差异吗?
- sql - Automate Azure SQL database creation and add a database user
- sql - ACCESS查询更新麻烦
- mysql - 按字段分组,然后根据单独表中的结果计算出现次数
- google-sheets - 用于解析/过滤数据并从主电子表格设置几个子电子表格的 Google 脚本
- python - `conda uninstall` 和 `pip uninstall` 是否也删除了依赖项,但只删除了其他包不使用的依赖项?
- node.js - Instagram API:获取访问令牌时平台应用程序无效
- linux - 文件名可以包含linux中的可执行代码吗?
- android - 为什么在 Android 上阅读 Mifare Classic 卡与在 PC 上阅读的价值不同?