【问题标题】:MySql GROUP BY and Aggregate functions in WHERE clause [duplicate]WHERE子句中的MySql GROUP BY和聚合函数[重复]
【发布时间】:2021-07-16 16:42:25
【问题描述】:

给定一个数据结构,例如

employees: 
 | id | name |
 |----|------|
 |1001| John |

sales:
 | id | employee_id | sale_price |
 |----|-------------|------------|
 |1   | 1001        |15.00       |
 |2   | 1001        |55.00       |
 |3   | 1001        |96.00       |

当按员工 ID 分组并对 sale_price 进行 SUM 时,查询按预期输出:

1001 | John | 166.00

我想写一个查询,例如:

SELECT A.*, SUM(B.sale_price) AS total 
FROM employees A
LEFT JOIN sales B
ON B.employer_id=A.id
WHERE SUM(B.sale_price) > 50 -- ERROR HERE
GROUP BY A.id

但我收到一条错误消息:Error Code: 1111. Invalid use of group function

据我了解,它无法评估 where 子句,因为尚未执行分组以使聚合函数起作用。有什么方法可以过滤这个聚合函数吗?

【问题讨论】:

  • 使用HAVING 子句。我投票结束是一个错字。
  • 为什么不使用命名良好的列:HAVING total > 50

标签: mysql sql


【解决方案1】:
SELECT A.id id, SUM(B.sale_price) AS total 
FROM employees A
LEFT JOIN sales B
ON B.employee_id=A.id
GROUP BY A.id
HAVING SUM(B.sale_price) > 50

你可以使用having子句。您的查询中有一个错字。 “select A.*”也应该是“A.id”。 上面的查询应该可以工作。

【讨论】:

  • 效果很好,谢谢,我不知道 HAVING 语法,允许我也使用别名列total > 50 谢谢!
  • 由于 A.id 可能是唯一键,所有其他 A 列在功能上都依赖于它,选择 A.* 是完全合法的。 (尽管在 5.7 之前的 mysql 和 mariadb 中不允许使用 ONLY_FULL_GROUP_BY - 请参阅 jira.mariadb.org/browse/MDEV-11588 - 至少 10.6)
【解决方案2】:

使用子查询

select *
from
(select *,
      (select sum(s.sale_price) from sales s where s.employee_id = e.id and s.sale_price > 50 group by s.employee_id) as totalPrice
    from employees e) T
where totalPrice > 50

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 2012-12-07
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 2022-10-25
    • 2019-02-16
    • 2020-01-22
    相关资源
    最近更新 更多