我想首先解释一下我的查询应该做什么。
在我的商店,我们销售产品A,B,C和D(产品ID) 让我们说我只对那些销售商品A的交易感兴趣
这是我写我的查询的方式
Select [Transaction_No],[Product ID]
from [MystoreDB$Transaction lines]
where Date = '01-Jan-2016'
and (Product ID) = 'A'
执行查询时没有任何错误,我只将结果过滤到产品ID A.
但如果我真的关注过滤后的交易,我可以看到在同一笔交易中还有其他产品被买了(产品B也被买了)
但该查询仅过滤了行'与产品A
For Instance 2016年1月1日共进行了4笔交易
交易1了 产品A + B
交易2了 仅限产品A
交易3了 产品A + C
交易4了 仅限产品A
最后,我希望我的查询只检索2个事务 这是交易2和4(因为只购买了产品A) 我将忽略事务1和3,因为另一个产品与产品A一起购买
我想知道的是所有只有产品A的交易。 这意味着,客户只购买了产品A而没有购买其他产品。 不知道怎么做到这一点。
我正在使用MYSQL作为数据库引擎
答案 0 :(得分:2)
SELECT
Transaction_No
FROM
Transactions
WHERE
Date = '01-Jan-2016'
GROUP BY
Transaction_No
HAVING
COUNT(CASE WHEN Product_Id = 'A' THEN Product_Id END) = COUNT(*)
使用条件聚合执行分组将为您提供所需的结果,并且由于没有子选择等,它应该比NOT EXISTS解决方案更快地执行。
根据您的评论编辑:
测试客户是否同时购买产品A& B但是没有其他产品你必须在你的HAVING子句中添加一些额外的约束。测试A的COUNT> 0和COUNT的B> 0然后是A&的COUNT B与所有产品的COUNT相同。
SELECT
Transaction_No
FROM
Transactions
WHERE
Date = '01-Jan-2016'
GROUP BY
Transaction_No
HAVING
COUNT(CASE WHEN Product_Id = 'A' THEN Product_Id END) > 0
AND COUNT(CASE WHEN Product_Id = 'B' THEN Product_Id END) > 0
AND COUNT(CASE WHEN Product_Id IN ('A','B') THEN Product_Id END) = COUNT(*)
答案 1 :(得分:0)
将此添加到您的WHERE
子句:L
AND [Transaction_No] NOT IN (
SELECT [Transaction_No]
FROM [MystoreDB$Transaction lines]
where [Product ID] <> 'A'
)
排除购买其他产品的客户。