如何在mysql中使用HAVING筛选聚合结果

嘿,我以前在做统计的时候就陷入过这个可怜的坑了。
我记得当时我手头有一个销售电子表格,记录了每个销售人员每月的销售额。

那是2 01 8 年,当时我们公司在全国开设了3 0多家分公司。
当时我想把那些销售额超过1 0万的销售人员淘汰掉,然后根据结果制定激励政策。

我先写了一条查询语句,想到用HAVING来过滤结果: sql SELECT salesperson_id, SUM(sales_amount) AS 总销售额 来自销售数据 按卖家 ID 分组 HAVING Total_sales > 1 00,000;
假设这应该不是问题,我将卖家分组并过滤掉总销售额大于 1 00,000 的卖家。

结果执行这个请求后,很长时间没有响应,页面一直卡住。
当时我不知道这是一个问题,还以为服务器坏了。
后来有同事帮我找到了这个,并说在WHERE中不能使用SUM函数,应该使用HAVING。

当时我就很困惑,心想,它们不都是一样的吗?后来他向我解释说,WHERE在分组前进行过滤,HAVING在分组后进行过滤。
我恍然大悟,赶紧改了语句,用了HAVING:
sql。
SELECT salesperson_id, SUM(sales_amount) AS 总销售额 来自销售数据 按卖家 ID 分组 HAVING SUM(sales_amount) > 1 00000;
一运行就立即出结果,效率非常高。

我后来总结了这一点。
HAVING和WHERE的区别在于WHERE先过滤再分组,而HAVING先分组再过滤。
所以以后如果遇到类似的统计问题,我肯定会先GROUP BY,然后用HAVING来过滤结果。
我记得这个陷阱。

MySQL如何利用分组函数进行数据汇总 MySQL GROUP BY与聚合函数结合使用

主要有两点:总计分组和按过滤结果分组。

首先我们来谈谈Group By。
您按 customer_id 对订单表进行分组,SUM(amount) 计算每个客户的总消费。
例如,客户A有3 个订单,金额为1 00,2 00,3 00。
分组后,计算SUM=6 00。

让我们谈谈存在。
GROUP BY 计算完每个组后,HAVING 再次过滤。
例如,如果您只想查看总消费超过 1 ,000 的客户,请在 HAVING 中添加条件 SUM(金额)> 1 ,000。

非聚合列必须遵循 GROUP BY。
例如,如果您选择 customer_id 和 order_date,GROUP BY 后面应该是 customer_id、order_date。

分组前进行WHERE过滤,分组后进行HAVING过滤。
如果您只想统计 2 02 3 年的订单,请使用“2 02 3 -01 -01 ”和“2 02 3 -1 2 -3 1 ”之间的 WHERE order_date。

常用函数:
AVG计算平均值。
比如每个产品类别的平均价格。

MAX 和 MIN 查找最大值和最小值。
例如每个部门的最高工资。

GROUP_CONCAT 字符串。
例如,每个客户购买的产品列表。

VAR_SAMP 和 STDDEV_SAMP 计算样本方差和标准差。
一般不使用,但在分析数据波动性时需要。

您具体希望实现什么功能?