我有一个包含四列的数据库。 '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这样做,但我真的不愿意。
答案 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
组是否包含所有三种产品。
修改强>
如果您对三个特定产品不感兴趣,并且想要检查任何产品,那么您可以使用以下查询:
SELECT Shop
FROM mytable
GROUP BY Shop
HAVING COUNT(DISTINCT CASE WHEN Stocked = 'True' THEN Product END) = COUNT(*)
上述查询会返回'Shop'
和'Shop4'
,因为这两家商店是唯一拥有所有产品库存的商店。
<强>最后:强>
您可以使用此查询:
SELECT Shop
FROM mytable
GROUP BY Shop
HAVING COUNT(DISTINCT CASE WHEN Stocked = 'True' THEN Product END) =
(SELECT COUNT(DISTINCT Product) FROM mytable)
在任何商店购买包含各种产品的商店。此查询返回'Shop2'
。