我有一个有四列的数据库。“日期检查”、“商店”、“产品”和“库存”。“date”是库存被检查的日期,“shop”只是商店的文本名称,“products”是各种产品的文本名称,而“stock”是一个布尔值,如果该商品是否有库存的话。它看起来像是:
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来做,但我真的不想。
发布于 2018-01-22 09:13:06
您可以使用以下查询:
SELECT Shop
FROM mytable
WHERE Stocked = 'True' AND Product IN ('Product1', 'Product2', 'Product3')
GROUP BY Shop
HAVING COUNT(DISTINCT Product) = 3WHERE子句过滤掉不相关的记录。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
https://stackoverflow.com/questions/48377945
复制相似问题