我感觉很愚蠢,因为我无法理解如何写这个。
我们希望返回购买了产品 A 但未购买产品 B 的客户。B 通常与 A 一起出现,因此这是一个销售机会。
我从中提取的数据是订单项级别的订单数据。现在我只提取客户名称和产品,然后进行分组,以便按客户列出产品,结果如下所示:
主要客户 | 产品 |
---|---|
客户 1 | 产品 A |
客户 1 | 产品B |
客户 1 | 产品C |
客户 2 | 产品 A |
客户 2 | 产品C |
我只需要退回客户 2,因为他们购买了产品 A 而不是产品 B。客户 1 这样做了,所以我需要删除它们。
答案 0 :(得分:1)
一种方法是聚合:
select PrimaryCustomer
from t
where product in ('A', 'B')
group by PrimaryCustomer
having max(product) = 'A';
这使用产品的排序。这也许是作弊。因此,您可能会发现这更一般:
having min(product) = max(product) and min(product) = 'A'
假设每个客户/产品都有一行,您还可以使用 not exists
:
select t.*
from t
where t.product = 'A' and
not exists (select 1
from t t2
where t2.PrimaryCustomer = t.PrimaryCustomer and
t2.product = 'B'
);
这样做的好处是很容易从表中返回其他列。
答案 1 :(得分:1)
有很多方法可以实现这一点。其中:
select primarycustomer from mytable where product = 'Product A'
except
select primarycustomer from mytable where product = 'Product B'