如何排除销售产品 A 但未销售产品 B 的客户

时间:2021-03-11 16:37:05

标签: sql sql-server

我感觉很愚蠢,因为我无法理解如何写这个。

我们希望返回购买了产品 A 但未购买产品 B 的客户。B 通常与 A 一起出现,因此这是一个销售机会。

我从中提取的数据是订单项级别的订单数据。现在我只提取客户名称和产品,然后进行分组,以便按客户列出产品,结果如下所示:

<头>
主要客户 产品
客户 1 产​​品 A
客户 1 产​​品B
客户 1 产​​品C
客户 2 产​​品 A
客户 2 产​​品C

我只需要退回客户 2,因为他们购买了产品 A 而不是产品 B。客户 1 这样做了,所以我需要删除它们。

2 个答案:

答案 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'