You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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后输出结果如下:

产品持有数量客户数
12
21
>=30

原有SQL问题说明

你之前的写法通过HAVING提前过滤了持有数>=3的客户,所以只能得到这部分结果;同时使用隐式内连接的写法可读性较差,推荐使用显式JOIN语法更易维护。

内容的提问来源于stack exchange,提问作者DanangFall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:06:02