【发布时间】:2021-11-19 20:52:56
【问题描述】:
在 Oracle 11g 中,我试图从数据查询中获得售价。是的,我可以将其导出并在其他地方编写代码,但我想尝试在查询中优雅地执行此操作。
我似乎只得到等式的第一部分,而不是我使用的最后一个案例:
WHEN sales_code
我最终要做的是从顶部获取结果并将其除以底部,但在 SALE_CODE 4 的情况下,我将 1+1 或 2 添加到顶部结果然后除以等式。
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(SUBSTR(size, 1,NVL(LENGTH(size) - 2,0)),1) > '35'
THEN 3.5
ELSE 3
END)
END +
CASE
WHEN sales_code='1' THEN 0 /(1-17/100)
WHEN sales_code='2' THEN 0 /(1-5/100)
WHEN sales_code='3' THEN 0 /(1-18/100)
WHEN sales_code='4' THEN 1+1 / (1-9.5/100)
WHEN sales_code='5' THEN 0 /(1-17/100)
WHEN sales_code='6' THEN 0 /(1-8/100)
WHEN sales_code='7' THEN 0 /((1-150)/100)
ELSE (100/100)
END,2) AS "Price",
我从查询中得到一个结果,但不是整个计算。我尝试了很多其他方法,但总是出现括号错误或其他任意错误。
任何帮助将不胜感激。
【问题讨论】:
-
如果您不发布包含错误的minimal reproducible example,我们将无法帮助您
-
我不明白你在做什么。
0 /(1-17/100)、0 /(1-5/100)等当然是零,那你为什么不直接WHEN sales_code In (1,2,3,5,6,7) THEN 0 WHEN sales_code = 4 THEN 1 + (1/0.905) ELSE 1 END呢? -
有多个问题: 1) 你不需要为每个条件重复
case,因为它只评估第一个满足的分支。所以case when carton_pack_qty = '1 then 0 when nvl(...) > '35' then 3.5 else 3 end2)substr函数返回一个字符串,但它被nvl(substr, 1)包裹,它隐式地将数字 (1) 转换为字符串 3) 然后你比较两个数字的字符串表示,这不等同于数字比较'6'大于'30'4) 为什么要包括常数计算,其中大部分计算为0?您可以使用常量 0 -
如果您现在想让您和未来支持者的生活更艰难,切勿使用双引号标识符