检索满足特定条件的行

时间:2016-11-14 17:30:43

标签: mysql sql

我想首先解释一下我的查询应该做什么。

在我的商店,我们销售产品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作为数据库引擎

2 个答案:

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

排除购买其他产品的客户。