如何删除无BUDGET_N或ACT_N数据的ER-月份组行?SQL咨询
需求与SQL修正
需求描述
- 现有一张数据表,需按如下规则筛选数据:
- 以
ER和MONTH为维度对数据分组 - 若某分组中不存在
SCENARIO_CD为BUDGET_N的数据,或不存在SCENARIO_CD为ACT_N的数据,则该分组所有行均不纳入最终结果 - 最终仅保留同时包含
BUDGET_N和ACT_N的ER+MONTH分组的全部行
- 以
初始代码问题分析
你提供的初始SQL逻辑与需求完全相反:
select * FROM your_table WHERE (ER, MONTH) IN ( SELECT ER, MONTH FROM your_table GROUP BY ER, MONTH HAVING COUNT(CASE WHEN SCENARIO_CD = 'BUDGET_N' THEN 1 END) = 0 OR COUNT(CASE WHEN SCENARIO_CD = 'ACT_N' THEN 1 END) = 0 );
这段代码会筛选出**缺少BUDGET_N或缺少ACT_N**的分组的所有行,恰好是需求中需要排除的数据。
修正后的SQL代码
要实现需求,需将HAVING子句的逻辑改为判断两种类型的数据同时存在:
SELECT * FROM your_table WHERE (ER, MONTH) IN ( SELECT ER, MONTH FROM your_table GROUP BY ER, MONTH HAVING COUNT(CASE WHEN SCENARIO_CD = 'BUDGET_N' THEN 1 END) > 0 AND COUNT(CASE WHEN SCENARIO_CD = 'ACT_N' THEN 1 END) > 0 );
更简洁的替代写法
可以通过COUNT(DISTINCT)快速判断两种类型是否都存在:
SELECT * FROM your_table WHERE (ER, MONTH) IN ( SELECT ER, MONTH FROM your_table WHERE SCENARIO_CD IN ('BUDGET_N', 'ACT_N') GROUP BY ER, MONTH HAVING COUNT(DISTINCT SCENARIO_CD) = 2 );
内容的提问来源于stack exchange,提问作者user138957
相关产品推荐
相关产品推荐

