S
面向产品经理的交互式SQL教学
通过真实业务数据,练习产品分析 SQL。
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–0 行
第 1 / 1 页
正在准备浏览器内 SQL 数据库…