首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果值始终为True,则SQL返回结果

如果值始终为True,则SQL返回结果
EN

Stack Overflow用户
提问于 2018-01-22 09:07:27
回答 1查看 104关注 0票数 1

我有一个有四列的数据库。“日期检查”、“商店”、“产品”和“库存”。“date”是库存被检查的日期,“shop”只是商店的文本名称,“products”是各种产品的文本名称,而“stock”是一个布尔值,如果该商品是否有库存的话。它看起来像是:

代码语言:javascript
复制
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在商店里有库存时,我需要返回商店的名称。我遇到了困难,因为下面的查询将返回基于每个单独的产品是否有库存的行,但只有当所有的产品都有库存时,我才需要它返回商店名。

代码语言:javascript
复制
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‘感兴趣,因为这是唯一一个所有项目在不同阶段都有库存的地方。

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

代码语言:javascript
复制
    Shop   Stocked
   ----------------
    Shop2   True

用SQL本机可以做到这一点吗?我可以把它导出到像excel这样的地方,让VBA来做,但我真的不想。

EN

回答 1

Stack Overflow用户

发布于 2018-01-22 09:13:06

您可以使用以下查询:

代码语言:javascript
复制
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

编辑:

如果您对三种特定产品不感兴趣,并且希望检查任何产品,则可以使用以下查询:

代码语言:javascript
复制
SELECT Shop
FROM mytable    
GROUP BY Shop
HAVING COUNT(DISTINCT CASE WHEN Stocked = 'True' THEN Product END) = COUNT(*)

上面的查询返回'Shop''Shop4',因为只有这两家商店拥有所有产品的库存。

Demo here

终于:

您可以使用以下查询:

代码语言:javascript
复制
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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48377945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档