2017-02-04 197 views
1

我通常会在java中使用流行的if-else语句,但在sqlplus中,我在select语句中使用case来查询下面的条件语句。Select语句问题?

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

这是错误的方式去做 - 很难写,读和维护。相反,应该为每个“定价结构”及其说明设置一个带有阈值的小表格;只计算查询中的边距并加入到这个小表中。这样,您可以非常轻松地添加或删除级别,更改阈值和/或更改说明。 – mathguy

回答

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。

+0

某些价值对于折扣列为空,因此如果根本没有折扣;它仍然会在这里计算这((零售成本)/成本)* 100这一个。 –

+0

我觉得你让我困惑。我在最后给出的描述是用于保证金计算。 – Jucan

+0

对不起。请忽略我之前的评论。我只记得折扣计算不包括在保证金列中。我会尝试绕过你建议的地方,我不需要使用nvl2,只需直接进行计算。在案件中,我太分心了,我忘了那些小小的信息。 –

0

您的case语句中不能使用别名“Margin”。你可以在你的case语句喜欢用“保证金”的整个公式:

(情况(保证金的NVL声明)> 60)

此外,一定要在你的case语句匹配相同的数据类型。所以,你不能使用to_char()> 60,因为你正在比较一个字符到整数。

希望这可以帮助:-)

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; 

好运。