SQL实现客户购买类别统计及CASE WHEN分组报错处理
需求实现方案
通用SQL解法(兼容所有主流数据库)
核心逻辑为先按客户ID分组,统计每个用户是否购买过对应产品,再基于统计结果输出购买类型:
SELECT `Customer ID`, CASE WHEN has_red = 1 AND has_blue = 1 THEN 'Both' WHEN has_red = 1 THEN 'Red only' WHEN has_blue = 1 THEN 'Blue only' END AS `Product Purchased` FROM ( SELECT `Customer ID`, -- 标记客户是否买过Red:1=买过,0=没买过 MAX(CASE WHEN `Product Purchased` = 'Red' THEN 1 ELSE 0 END) AS has_red, -- 标记客户是否买过Blue:1=买过,0=没买过 MAX(CASE WHEN `Product Purchased` = 'Blue' THEN 1 ELSE 0 END) AS has_blue FROM 你的交易表名 -- 替换为实际表名 GROUP BY `Customer ID` ) AS customer_purchase_stat
简化SQL解法(仅需统计Red、Blue两类时可用)
如果仅需要统计这两类产品,可省去子查询,直接在分组后做判断:
SELECT `Customer ID`, CASE WHEN COUNT(DISTINCT `Product Purchased`) = 2 THEN 'Both' WHEN MAX(`Product Purchased`) = 'Red' THEN 'Red only' ELSE 'Blue only' END AS `Product Purchased` FROM 你的交易表名 WHERE `Product Purchased` IN ('Red','Blue') -- 过滤无关产品 GROUP BY `Customer ID`
报错原因说明
- 不分组直接写CASE WHEN:每条交易记录都会生成一行结果,同一个客户有多条交易时自然出现重复ID
- 直接分组但CASE WHEN未包裹聚合函数:分组后数据库无法确定要取该客户下多条交易中哪一条的判断结果,因此抛出字段未聚合的报错
内容的提问来源于stack exchange,提问作者WascallyWabbit
相关产品推荐
相关产品推荐

