SQL 课程 11:带聚合函数的查询(第 2 部分)

上一课的聚合函数给出了一个总答案;但产品分析更常需要比较不同对象。例如各商机阶段分别有多少条记录、哪位销售人员带来的成交金额最高、哪个行业的已成交商机更多。

GROUP BY 会先把记录按某个字段分成多组,再在每组内计算 COUNT、SUM 或 AVG。HAVING 则用于筛选已经聚合后的分组结果。

按业务维度分组汇总
SELECT 分组字段, 聚合函数(字段) AS 指标
FROM 表名
WHERE 行级筛选条件
GROUP BY 分组字段
HAVING 聚合后的筛选条件
ORDER BY 指标 DESC;

GROUP BY:先分组,再计算

例如按 deal_stage 分组后,数据库会分别形成已成交、已流失、跟进中、待开发四组,再为每组计算商机数。SELECT 中除聚合函数外出现的字段,通常都需要写在 GROUP BY 中。

查看各商机阶段的商机数量
SELECT deal_stage,
       COUNT(*) AS opportunity_count
FROM sales_pipeline
GROUP BY deal_stage;

小提醒:GROUP BY 的字段决定了分析粒度:按销售人员分组得到“人”的表现,按客户分组得到“客户”的表现。

WHERE 和 HAVING:筛选的时机不同

WHERE 在分组前过滤原始记录,适合写 deal_stage = 'Won' 这类行级条件;HAVING 在分组和聚合后过滤结果,适合写 COUNT(*) >= 100 这类指标条件。

只保留商机数不少于 100 的销售人员
SELECT sales_agent, COUNT(*) AS won_opportunity_count
FROM sales_pipeline
WHERE deal_stage = 'Won'
GROUP BY sales_agent
HAVING COUNT(*) >= 100;

两种筛选的分工

子句筛选对象CRM 示例
WHERE一条原始商机记录WHERE deal_stage = 'Won'
HAVING一组汇总结果HAVING COUNT(*) >= 100

练习

分组题会同时校验分组字段、聚合指标和 WHERE/HAVING 的作用范围;需要排序的题还会校验顺序。

表格:sales_pipeline(商机)

查询返回 0 行。

显示第 00
1 / 1
正在准备浏览器内 SQL 数据库…