如何查询所有产品的C、D列全为NULL/非NULL的店铺
店铺产品数据的SQL查询需求与解决方案
我有一张包含以下字段的表:
- Column A: 店铺ID
- Column B: 店铺的产品ID
- Column C: 产品价格
- Column D: 产品折扣
表中数据如下:
| Column A | Column B | Column C | Column D |
|---|---|---|---|
| 100 | 5 | 0 | 3 |
| 100 | 6 | 1 | 5 |
| 100 | 7 | null | null |
直接用IS NULL查询Column C和Column D只能拿到第3行数据,但店铺100还有其他已设置价格和折扣的产品,现需实现两个查询需求:
需求1:查询所有产品的Column C和Column D值均为NULL的店铺
这类店铺的所有产品都未设置价格和折扣,可通过分组+条件统计实现:
SELECT `Column A` AS shop_id FROM your_table_name GROUP BY `Column A` HAVING COUNT(CASE WHEN `Column C` IS NOT NULL OR `Column D` IS NOT NULL THEN 1 END) = 0;
逻辑说明
按店铺分组后,统计该店铺下存在价格或折扣不为NULL的产品数量,当数量为0时,说明该店铺所有产品的价格和折扣均为NULL。
需求2:查询所有产品的Column C和Column D值均不为NULL的店铺
这类店铺的每款产品都已设置价格和折扣,提供两种实现语句:
写法一:统计无效产品数
SELECT `Column A` AS shop_id FROM your_table_name GROUP BY `Column A` HAVING COUNT(CASE WHEN `Column C` IS NULL OR `Column D` IS NULL THEN 1 END) = 0;
逻辑说明
按店铺分组后,统计该店铺下存在价格或折扣为NULL的产品数量,当数量为0时,说明该店铺所有产品的价格和折扣均不为NULL。
写法二:对比总产品数与有效产品数
SELECT `Column A` AS shop_id FROM your_table_name GROUP BY `Column A` HAVING COUNT(*) = COUNT(CASE WHEN `Column C` IS NOT NULL AND `Column D` IS NOT NULL THEN 1 END);
逻辑说明
COUNT(*)统计该店铺的总产品数COUNT(CASE...)统计该店铺下价格和折扣均不为NULL的产品数- 两者相等时,说明所有产品都符合条件
内容的提问来源于stack exchange,提问作者Subhashree Nayak
相关产品推荐
相关产品推荐

