如果值为True,则返回SQL结果

时间:2018-01-22 09:07:27

标签: mysql sql

我有一个包含四列的数据库。 'Date Checked','Shop','Product'和'Stocked'。 '日期'是股票被检查的日期,'商店'只是商店的文字名称,'产品'只是各种产品的文字名称,'库存'是一个布尔值,如果该项目是库存的或不。它看起来像:

Date        Shop    Product    Stocked
01/01/2018  Shop1   Product1    TRUE
02/01/2018  Shop1   Product2    TRUE
03/01/2018  Shop1   Product3    TRUE
04/01/2018  Shop1   Product4    FALSE
05/01/2018  Shop2   Product1    TRUE
06/01/2018  Shop2   Product2    TRUE
07/01/2018  Shop2   Product3    TRUE
08/01/2018  Shop2   Product4    TRUE
09/01/2018  Shop2   Product5    TRUE
10/01/2018  Shop3   Product2    FALSE
11/01/2018  Shop4   Product1    TRUE
12/01/2018  Shop4   Product2    TRUE
13/01/2018  Shop4   Product3    TRUE
14/01/2018  Shop4   Product4    TRUE

如果(并且仅限于)产品A,B和C存放在商店中,我需要返回商店名称。我遇到了困难,因为以下查询会根据每个个人产品是否有库存来返回行,但我需要它才能在所有产品都有的情况下返回商店名称从来没有库存过。

USE [Worldwide_Stock]

SELECT DISTINCT
 Stock.Date AS 'Date',
 Stock.Shop AS 'Location',
 Stock.Product AS 'Item',
 Stock.Stocked AS 'Stocked'

FROM
 Stock with (nolock)

where

    Stock.Product = 'ProductOne' OR 
    Stock.Product = 'ProductTwo' OR 
    Stock.Product = 'ProductThree' OR 
    Stock.Product = 'ProductFour' OR 
    Stock.Product = 'ProductFive')

  AND 

    Stock.Stocked = 'True'


 ORDER BY Stock.Shop

我对只有一个或两个库存的地点不感兴趣,我不在乎物品目前没有库存(或者过去没有)。在上面的例子中,我只对返回'Shop2'感兴趣,因为它是唯一一个所有项目在一个阶段或另一个阶段库存的人。

我只是以以下格式寻找我的结果:

    Shop   Stocked
   ----------------
    Shop2   True

是否可以使用SQL本机执行此操作?我可以把它导出到像excel这样的东西,并让VBA这样做,但我真的不愿意。

1 个答案:

答案 0 :(得分:4)

您可以使用以下查询:

SELECT Shop
FROM mytable
WHERE Stocked = 'True' AND Product IN ('Product1', 'Product2', 'Product3')
GROUP BY Shop
HAVING COUNT(DISTINCT Product) = 3

WHERE子句过滤掉不相关的记录。 HAVING子句检查Shop组是否包含所有三种产品。

Demo here

修改

如果您对三个特定产品不感兴趣,并且想要检查任何产品,那么您可以使用以下查询:

SELECT Shop
FROM mytable    
GROUP BY Shop
HAVING COUNT(DISTINCT CASE WHEN Stocked = 'True' THEN Product END) = COUNT(*)

上述查询会返回'Shop''Shop4',因为这两家商店是唯一拥有所有产品库存的商店。

Demo here

<强>最后:

您可以使用此查询:

SELECT Shop
FROM mytable    
GROUP BY Shop
HAVING COUNT(DISTINCT CASE WHEN Stocked = 'True' THEN Product END) = 
       (SELECT COUNT(DISTINCT Product) FROM mytable)

在任何商店购买包含各种产品的商店。此查询返回'Shop2'

Demo here