Oracle 11g嵌套CASE语句计算销售价格逻辑不生效问题求助
问题原因
- 逻辑结构错误:原SQL将最后CASE的计算结果与前半段基础价格做加法运算,完全没有实现「基础价格/对应分母」的核心逻辑,仅做了无意义的0值加法。
- 运算优先级错误:sales_code='4'场景的写法
1+1 / (1-9.5/100)会优先执行除法再执行加法,不符合先加2再做除法的需求。 - 数值规则错误:原sales_code='7'的分母
(1-150)/100计算结果为-1.49,不符合常规价税分离的计算逻辑,属于笔误。 - 潜在类型错误:SUBSTR截取size后得到字符串直接和'35'做比较,会出现'100'<'35'这类不符合数值判断逻辑的问题。
修正后完整SQL
round( -- 前半段基础价格计算 ( to_number(price) * CASE WHEN class_code='X' THEN .48 ELSE .5 END * e1.set_qty + CASE WHEN carton_pack_qty = '1' THEN 0 ELSE CASE WHEN NVL(TO_NUMBER(SUBSTR(size, 1,NVL(LENGTH(size) - 2,0))),1) > 35 THEN 3.5 ELSE 3 END END -- sales_code=4时先加2 + CASE WHEN sales_code='4' THEN 2 ELSE 0 END ) -- 统一除以对应分母 / CASE WHEN sales_code='1' THEN (1-17/100) WHEN sales_code='2' THEN (1-5/100) WHEN sales_code='3' THEN (1-18/100) WHEN sales_code='4' THEN (1-9.5/100) WHEN sales_code='5' THEN (1-17/100) WHEN sales_code='6' THEN (1-8/100) WHEN sales_code='7' THEN (1-15/100) -- 原写法分母为负数明显不合理,可根据实际业务修改税率 ELSE 1 END ,2) AS "Price"
注意事项
- 已将size截取后的内容转为数值类型再做比较,避免字符串排序导致的判断错误,如果你业务中size就是按字符串规则判断,可以改回原字符串比较写法。
- sales_code='7'的分母按常规15%税率修正,若实际业务有其他规则可直接修改对应值即可。
- 完全贴合需求:非sales_code=4场景直接用基础价格除以对应分母,sales_code=4场景基础价格加2后再除以对应分母。
内容的提问来源于stack exchange,提问作者m________
相关产品推荐
相关产品推荐

