SQL查询实现:筛选待计费买苹果且未购买蔬菜的客户记录
需求说明
现有存储客户商品发货明细的业务表,字段定义如下:
Item:商品编码Name:商品名称Group:商品分类To_be_billed:是否待计费,值为Yes/NoCustomerNo.:客户编号
表内记录的客户购买行为只有两类:部分客户仅购买苹果,部分客户同时购买苹果、属于蔬菜分类的土豆。
需要编写SQL查询,返回同时满足以下两个条件的记录:
- 记录自身的
To_be_billed字段值为Yes - 记录关联的客户,历史上从未购买过分类为
Vegetable(蔬菜)的商品
结合样例数据的校验逻辑:
- 客户1、客户5存在待计费的苹果购买记录,且无蔬菜类商品购买记录,符合要求
- 客户4虽有待计费苹果记录,但买过属于蔬菜类的土豆,不符合要求
- 客户2、客户3的苹果购买记录
To_be_billed值为No,不符合要求 - 最终预期返回客户1、5对应的两条待计费苹果记录
实现SQL
使用NOT EXISTS子查询过滤存在蔬菜购买记录的客户,语义准确且性能优于NOT IN写法,注意Group是SQL保留字、CustomerNo.带特殊字符,查询时需要用反引号包裹:
SELECT t.* FROM 发货明细表 t WHERE t.To_be_billed = 'Yes' AND NOT EXISTS ( SELECT 1 FROM 发货明细表 t2 WHERE t2.`CustomerNo.` = t.`CustomerNo.` AND t2.`Group` = 'Vegetable' );
使用时将SQL里的
发货明细表替换为你实际环境中的表名即可。
内容的提问来源于stack exchange,提问作者MegaOctane
相关产品推荐
相关产品推荐

