为了简单起见,假设我有一个包含客户端的表和他们持有的产品,如下所示:
Client_ID Product_Held
1 Product1
1 Product2
1 Product3
2 Product1
2 Product2
3 Product1
3 Product1
客户可以持有产品的任意组合,以及同一产品的倍数。
我希望能够将查询限制在仅包含Product1和Product2的所有客户端,并且我在确定所需的逻辑时遇到了一些困难。如果我搜索具有Product1和Product2的所有客户,我的结果将包括仅持有Product1的用户以及仅持有Product2的用户。
过去我只是将我的结果转储到Excel中,添加了一个结合两个字段的列,即1Product1,1Product2,并编写一个快速公式,基本上说如果1Product1存在,并且1Product2存在,则标记为OK并过滤掉其他所有内容,但可能相反,通过我的查询来完成它应该是相当简单的。
我觉得我应该有类似的东西:
WHERE Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product1'
AND Client_ID exists in Client_ID + Product_Held AND Product_Held = 'Product2'
但是语法有问题,也不确定这是否是一个有效的方法?
答案 0 :(得分:0)
您可以使用聚合和having
:
select client_id
from t
group by client_id
having sum(case when product_held = 'Product1' then 1 else 0 end) > 0 and
sum(case when product_held = 'Product2' then 1 else 0 end) > 0 and
sum(case when product_held in ('Product1', 'Product2') then 1 else 0 end) = count(*);
这是做什么的?前两个条件是计算每个产品为每个客户显示的次数。 > 0
表示至少有一个。
最后一个条件检查两个产品的数量是否与所有行匹配。这保证了所有产品都是这两种产品。您也可以将其表达为:
sum(case when product_held not in ('Product1', 'Product2') then 1 else 0 end) = 0;