Select Statement问题中的案例?

时间:2017-02-04 21:21:31

标签: sql oracle case

我通常会在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

3 个答案:

答案 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;

祝你好运。