如何编写SQL统计持有1、2及3件及以上产品的客户数量
解决方案
实现思路
- 第一步:关联客户表和产品表,按客户ID分组,统计每个客户持有的产品总数
- 第二步:用
CASE WHEN语句对产品总数做分箱映射,分成1、2、>=3三个类别 - 第三步:按分箱后的类别分组,统计每个类别对应的客户数量
可执行SQL代码
SELECT CASE WHEN prod_count = 1 THEN '1' WHEN prod_count = 2 THEN '2' ELSE '>=3' END AS 产品持有数量, COUNT(cust_id) AS 客户数 FROM ( -- 子查询:统计每个客户的持有产品数量 SELECT c.cust_id, COUNT(p.prod_no) AS prod_count FROM Customer c LEFT JOIN Product p ON c.cust_id = p.prod_cust_id -- 不需要统计持有0件产品的客户可保留该行,需要统计则删除 WHERE p.prod_cust_id IS NOT NULL GROUP BY c.cust_id ) cust_prod_cnt GROUP BY CASE WHEN prod_count = 1 THEN '1' WHEN prod_count = 2 THEN '2' ELSE '>=3' END -- 可选:按持有数量排序输出 ORDER BY 产品持有数量
注:如果使用MySQL、PostgreSQL等支持GROUP BY引用SELECT别名的数据库,外层查询的GROUP BY部分可以简化为
GROUP BY 产品持有数量,无需重复写CASE逻辑。
样例数据运行结果
对照你提供的测试数据,执行上述SQL后输出结果如下:
| 产品持有数量 | 客户数 |
|---|---|
| 1 | 2 |
| 2 | 1 |
| >=3 | 0 |
原有SQL问题说明
你之前的写法通过HAVING提前过滤了持有数>=3的客户,所以只能得到这部分结果;同时使用隐式内连接的写法可读性较差,推荐使用显式JOIN语法更易维护。
内容的提问来源于stack exchange,提问作者DanangFall
相关产品推荐
相关产品推荐

