mysql - 如果值永远为真,则 SQL 返回结果

标签 mysql sql

<分区>

我有一个包含四列的数据库。 “检查日期”、“商店”、“产品”和“库存”。 'Date' 是检查库存的日期,'Shop' 只是商店的文本名称,'Product' 只是各种产品的文本名称,'Stocked' 是一个 bool 值,表示该商品是否有库存或不。它看起来像:

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 产品是否有库存返回行,但只有当 all 产品有库存时我才需要它返回商店名称曾经被放养。

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

最佳答案

您可以使用以下查询:

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

关于mysql - 如果值永远为真,则 SQL 返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48377945/

相关文章:

mysql - 表内的乘法触发器

mysql - 一起使用 DISTINCT 和 COUNT

mysql - 无法连接到 '127.0.0.1' (10061) 上的 MySQL 服务器

c# - 您可以调用多个存储过程作为事务回滚的一部分c#

mysql - 如何在没有选择列的情况下将 MySqlDump 文件导入 MySQL

mysql - 如何从 csv 文件将外键分配给 MySQL 表?

mysql - MySQL 中特定的 ORDER BY 子句

mysql - 查找字符串中最后一个单词的 SQL 语句

sql - 如何计算列的平均值然后将其包含在oracle的选择查询中?

mysql - 表的规范化