SQL维度层级CASE语句:客户双卡使用标识查询实现问题
解决方案:生成客户双卡标识(Dualflag)
你需要为每个客户生成Dualflag标识:若客户同时持有Debit(借记卡)和Credit(信用卡)则标记为Yes,否则为No。用行号函数无法同步同一客户所有行的标识结果,推荐以下两种高效解决方法:
方法1:使用窗口函数统计不同卡类型
利用窗口函数直接在原表每行计算对应客户的卡类型数量,实现同一客户所有行标识同步:
SELECT Customer, Card_Type, CASE WHEN COUNT(DISTINCT Card_Type) OVER (PARTITION BY Customer) = 2 THEN 'Yes' ELSE 'No' END AS Dualflag FROM your_table_name;
关键逻辑:
PARTITION BY Customer:按客户分组,确保统计范围限定在单个客户内COUNT(DISTINCT Card_Type):统计该客户拥有的不同卡类型数量,同时存在Debit和Credit时结果为2- CASE语句根据统计值生成标识,同一客户的所有行将获得相同的
Dualflag
方法2:分组统计后关联原表
如果你的SQL方言不支持窗口函数中的DISTINCT(如旧版MySQL),可先分组统计客户的卡类型情况,再关联回原表:
WITH customer_card_stats AS ( SELECT Customer, CASE WHEN SUM(CASE WHEN Card_Type = 'Debit' THEN 1 ELSE 0 END) > 0 AND SUM(CASE WHEN Card_Type = 'Credit' THEN 1 ELSE 0 END) > 0 THEN 'Yes' ELSE 'No' END AS Dualflag FROM your_table_name GROUP BY Customer ) SELECT t.Customer, t.Card_Type, s.Dualflag FROM your_table_name t JOIN customer_card_stats s ON t.Customer = s.Customer;
关键逻辑:
- 子查询
customer_card_stats:按客户分组,分别检查Debit和Credit是否存在,同时满足则标记Yes - 通过JOIN将统计结果关联到原表的每一行,确保同一客户的所有行标识一致
内容的提问来源于stack exchange,提问作者Gaurav Jan
相关产品推荐
相关产品推荐

