SQL中如何根据PRODUCTIONORDERSTATUS为SCHEDULEDQUANTITY条件赋值
问题背景
需要在CTE中实现基于PRODUCTIONORDERSTATUS列值的SCHEDULEDQUANTITY计算逻辑:
PRODUCTIONORDERSTATUS取值为3或4时,返回SCHEDULEDQUANTITY原始值PRODUCTIONORDERSTATUS为其他值时,返回0
原有实现代码未得到预期结果。
原代码存在的问题
- CASE语法不符合SQL规范:WHEN分支后仅支持写判断条件,THEN后直接写返回值,不支持
列名=值的赋值写法 - 判断逻辑存在逻辑漏洞:原条件
PRODUCTIONORDERSTATUS != 3 OR PRODUCTIONORDERSTATUS !=4对所有可能的取值都成立(例如值为3时满足!=4,值为4时满足!=3),会导致所有行都触发第一个分支返回0 - 聚合顺序错误:需要先逐行判断状态、计算单行列值,再做分组聚合,直接聚合原始值再单独计算CASE列既不符合业务逻辑,还会因为SELECT列未包含在GROUP BY或聚合函数中触发语法报错
- CTE字段映射错误:CTE声明了3个输出字段,但SELECT子句中SUM计算的原始数量列未指定别名,无法和CTE字段对应。
修正后的代码
POH (ITEMNUMBER, SCHEDULEDQUANTITY, CASE1) AS ( SELECT ITEMNUMBER, SUM(SCHEDULEDQUANTITY) AS SCHEDULEDQUANTITY, SUM( CASE WHEN PRODUCTIONORDERSTATUS IN (3, 4) THEN SCHEDULEDQUANTITY ELSE 0 END ) AS CASE1 FROM POH GROUP BY ITEMNUMBER )
说明:如果不需要保留原始的排产数量总和,可以删掉SELECT子句里的
SUM(SCHEDULEDQUANTITY) AS SCHEDULEDQUANTITY这一行,同步删掉CTE定义里对应的SCHEDULEDQUANTITY字段即可。
内容的提问来源于stack exchange,提问作者Revilo
相关产品推荐
相关产品推荐

