获取从未出现订单失败的忠诚客户ID的SQL查询需求
筛选忠诚客户ID的SQL解决方案
嘿,这问题我熟,给你几个实用的SQL写法,都能精准筛选出那些从没出过失败订单的忠诚客户ID(也就是所有订单状态都是成功S的客户):
方法1:用NOT EXISTS(性能友好,逻辑清晰)
这种写法是数据库优化器比较喜欢的,逻辑也直白——找出不存在任何失败订单的客户:
SELECT DISTINCT cust_id FROM Order WHERE NOT EXISTS ( SELECT 1 FROM Order o2 WHERE o2.cust_id = Order.cust_id AND o2.status = 'F' );
小说明:加DISTINCT是因为同一个客户可能有多个成功订单,避免重复返回同一个客户ID。
方法2:用GROUP BY + HAVING分组校验
通过对客户ID分组,检查组内有没有失败订单:
如果订单状态只有S和F两种,简洁写法:
SELECT cust_id FROM Order GROUP BY cust_id HAVING MAX(status) != 'F';
要是担心有其他状态值,更严谨的写法(统计失败订单数为0):
SELECT cust_id FROM Order GROUP BY cust_id HAVING SUM(CASE WHEN status = 'F' THEN 1 ELSE 0 END) = 0;
小说明:第二种HAVING子句会统计每个客户的失败订单数量,等于0就说明完全没有失败订单,符合忠诚客户的定义。
方法3:用NOT IN排除法
先找出所有有过失败订单的客户ID,再从总客户里排除他们:
SELECT DISTINCT cust_id FROM Order WHERE cust_id NOT IN ( SELECT cust_id FROM Order WHERE status = 'F' );
小提醒:如果你的数据里存在cust_id为NULL的情况,NOT IN可能会出问题,这时候优先用方法1更稳妥。
内容的提问来源于stack exchange,提问作者pratik deshai
相关产品推荐
相关产品推荐

