统计每次到店购买超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
相关产品推荐
相关产品推荐

