我通常会在java中使用流行的if-else语句,但是在sqlplus中我使用select语句中的case来查询我在下面的条件语句。
select title, to_char(nvl2(((retail-cost)/cost)*100,
((retail-cost)/cost)*100,
((retail-cost)/cost)*100), '99999.99') "Margin",
to_char(discount, '99999.99') "Discount",
(case when ("Margin" >= 60) then 'Very High Profit'
when ("Margin" >= 30) then 'High Profit'
else ("Margin" >= 0) then 'Loss Leader'
end) "Pricing Structure"
from books
order by title;
我希望得到这样的东西作为我的结果,但我试图改变顺序;我每次都会遇到错误。
TITLE Margin Discount Pricing Structure
------------------------------ -------- --------- ---------------------------------
BIG BEAR AND LITTLE DOVE 68.23 Very high profit
BODYBUILD IN 10 MINUTES A DAY 65.07 Very high profit
答案 0 :(得分:4)
除非在子查询中,否则sql无法看到别名。你应该这样写:
case
when (retail-cost/cost)*100 >= 60 then 'Very High Profit'
when (retail-cost/cost)*100 >= 30 then 'High Profit'
when (retail-cost/cost)*100 >= 0 then 'Loss Leader'
else 'SOMETHING HERE'
end "Pricing Structure"
还需要考虑的是这个nvl2:
to_char(nvl2(((retail-cost)/cost)*100,
((retail-cost)/cost)*100,
((retail-cost)/cost)*100), '99999.99')
对你没有任何帮助。为什么?导致nvl2(exp1,exp2,exp3)。如果exp1不为null,则打印exp2,当它为null时,则打印exp3。不仅如此,你的NVL在这里什么都不做,因为它总会输出((零售成本)/成本)* 100。你最好只写to_char(((retail-cost)/cost)*100),'99999.99')
。
如果你的exp1 = exp2那么你最好只写NVL(exp1,exp2)。如果exp1不为null,则它将打印它,否则它将打印exp2。
答案 1 :(得分:0)
您不能使用别名"保证金"在你的案例陈述中。您可以使用" Margin"的整个公式。在您的案例陈述中,如:
(案例(保证金的NVL声明)> 60)
此外,请确保在case语句中匹配相同的数据类型。所以,你不能使用to_char()> 60,因为您要将字符与整数进行比较。
希望这可能会有所帮助: - )
答案 2 :(得分:0)
使用公用表表达式(CTE)从案例逻辑中分解计算:
WITH CDATA AS (select title,
((retail-cost)/cost)*100 AS MARGIN,
to_char(discount, '99999.99') AS "Discount"
from books)
SELECT TITLE,
TO_CHAR(MARGIN, '99999.99') AS "Margin",
"Discount",
case
when MARGIN >= 60 then 'Very High Profit'
when MARGIN >= 30 then 'High Profit'
else MARGIN >= 0 then 'Loss Leader'
end AS "Pricing Structure"
order by title;
祝你好运。