【问题标题】:SQL return results if values are ever True [duplicate]如果值曾经为真,则 SQL 返回结果 [重复]
【发布时间】:2018-01-22 09:07:27
【问题描述】:

我有一个包含四列的数据库。 “检查日期”、“商店”、“产品”和“库存”。 'Date' 是检查库存的日期,'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 曾经在商店中存货时,我需要返回商店名称。我遇到了困难,因为以下查询将根据每个 individual 产品是否有库存返回行,但只有当 所有 产品有曾经有货。

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来做,但我真的不想这样做。

【问题讨论】:

  • 使用该表数据,同时指定预期结果。

标签: mysql sql


【解决方案1】:

您可以使用以下查询:

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

【讨论】:

  • Giorgos,在工作中扔一个扳手,有没有办法在没有“HAVING COUNT”的情况下做到这一点?或者是否可以将“HAVING COUNT”作为“WHERE”子句的一部分?我上面没有提到的一点是,每个商店应该库存的产品的确切类型可能会有所不同,我们可能事先不知道他们应该拥有多少产品。
  • 如果您希望显示所有产品,而不仅仅是特定列表,您可以添加一个子查询来获取所有产品。 SELECT Shop FROM mytable WHERE Stocked = 'True' AND Product IN (SELECT DISTINCT Product FROM mytable) GROUP BY Shop HAVING COUNT(DISTINCT Product) = 5
  • @HDCerberus 请检查我所做的编辑。
猜你喜欢
  • 2012-10-12
  • 2017-07-28
  • 2019-03-10
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
相关资源
最近更新 更多