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

统计每次到店购买超3种不同CD的客户数及SQL语句修正求助

修正你的SQL:统计到店购买3种以上不同CD的客户数量

嘿,你的原SQL有几个明显的问题,导致没法正确实现需求,我来帮你一步步修正:

原SQL的问题点

  • 分组维度错了:要统计「每次到店」的情况,得按客户ID、到店日期、门店(CLIENT_ID, DATE, SHOP)分组——毕竟同一客户同一天在不同门店是两次不同的到店,而且AMOUNT是购买数量,完全不影响不同CD的统计,不该放进GROUP BY里;
  • 统计逻辑不对:你要的是「不同CD的数量」,得用COUNT(DISTINCT CD_ID),而不是COUNT(*)——后者只会数销售明细的行数,不管是不是同一种CD;
  • 别名不一致:你给SALES表起了别名s,但SELECT里写的是Sales.Client_id,得统一用别名;
  • 多余的DISTINCT:GROUP BY已经会按分组字段聚合,再加DISTINCT纯属画蛇添足。

正确的SQL实现

第一步:找出所有满足条件的到店记录

先把每次到店中,购买不同CD数量超过3的记录查出来:

SELECT s.CLIENT_ID, s.DATE, s.SHOP
FROM SALES s
GROUP BY s.CLIENT_ID, s.DATE, s.SHOP
HAVING COUNT(DISTINCT s.CD_ID) > 3;

第二步:统计满足条件的客户总数

如果你的最终需求是「有多少客户至少有一次到店买了3种以上不同CD」,就把上面的结果嵌套一层,统计去重后的客户ID数量:

SELECT COUNT(DISTINCT t.CLIENT_ID) AS qualified_client_count
FROM (
    SELECT s.CLIENT_ID
    FROM SALES s
    GROUP BY s.CLIENT_ID, s.DATE, s.SHOP
    HAVING COUNT(DISTINCT s.CD_ID) > 3
) t;

可选:关联CD表过滤有效CD

如果只想统计CD表中存在的CD种类(排除SALES里无效的CD_ID,比如你数据里的12、42这些),可以加个JOIN:

SELECT COUNT(DISTINCT t.CLIENT_ID) AS qualified_client_count
FROM (
    SELECT s.CLIENT_ID
    FROM SALES s
    JOIN CD c ON s.CD_ID = c.ID
    GROUP BY s.CLIENT_ID, s.DATE, s.SHOP
    HAVING COUNT(DISTINCT s.CD_ID) > 3
) t;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:27:20