如何用SQL筛选Walmart供应商中符合特定条件的唯一项目
筛选符合条件的Walmart项目SQL实现
需求说明
我有一个包含多家供应商project(项目)的数据集,每个项目包含数百个不同objective(目标),结果状态为achieved(已完成)或unrealised(未实现)。部分目标会在第二列external_objective(外部目标)中列出,该列数据来自另一数据源。
需要生成供应商Walmart的唯一project列表,满足以下条件:
- 项目中所有标记为
achieved的目标,必须同时存在于objective和external_objective列中(即两列值相等且非空) - 项目中
unrealised目标的存在不影响结果,但如果项目存在任何未同时出现在两列的achieved目标,该项目需被排除
数据集示例
| project | objective | external_objective | status |
|---|---|---|---|
| b12345 | abcdef | abcdef | achieved |
| c23456 | abcdeg | achieved | |
| d23456 | bbcdvg | unrealised | |
| b12345 | ghfjds | achieved | |
| d23456 | fghjka | fghjka | achieved |
预期结果
仅选中项目d23456,排除b12345和c23456。
原SQL问题分析
你当前编写的SQL存在逻辑缺陷:
SELECT DISTINCT Project FROM dataset WHERE supplier="walmart" AND status = "achieved" AND objectives IS NOT NULL AND external_objectives IS NOT NULL GROUP BY project
- 该语句仅筛选出存在至少一个符合条件的achieved目标的项目,但无法保证项目中所有achieved目标都满足条件
- 例如项目
b12345有一个符合条件的achieved目标,但另一个achieved目标不符合,原语句会错误地将其包含进来
正确SQL实现方案
方案一:使用HAVING子句排除不合格项目
SELECT project FROM dataset WHERE supplier = 'walmart' GROUP BY project HAVING -- 确保所有achieved的目标都满足objective和external_objective匹配且非空 SUM( CASE WHEN status = 'achieved' AND (objective != external_objective OR objective IS NULL OR external_objective IS NULL) THEN 1 ELSE 0 END ) = 0
方案二:使用NOT EXISTS排除存在不合格目标的项目
SELECT DISTINCT d1.project FROM dataset d1 WHERE d1.supplier = 'walmart' AND NOT EXISTS ( SELECT 1 FROM dataset d2 WHERE d2.project = d1.project AND d2.status = 'achieved' AND (d2.objective != d2.external_objective OR d2.objective IS NULL OR d2.external_objective IS NULL) )
逻辑说明
两种方案核心逻辑一致:
- 聚焦Walmart的项目
- 检查项目中是否存在任何不符合要求的
achieved目标(即objective和external_objective不匹配或任一为空) - 仅保留不存在这类不合格目标的项目
内容的提问来源于stack exchange,提问作者nirdnaleuq
相关产品推荐
相关产品推荐

