2016-11-16 98 views
5

我试图从连接中创建一个表并根据id对一些字段进行求和。这部分工作很好。我也想添加一个额外的列,并使用一个案例,当我想要填充它的声明。GROUP BY after CASE WHEN

这里是脚本

CREATE TABLE TABLE1 
AS 
    SELECT ID, IDC, SUM(AMOUNT) PRICE, SUM(COST) COST, SUM(AMOUNT-COST) PROFIT, 
    CASE PROFIT 
    WHEN PROFIT < 1000 THEN 'Low' 
    WHEN PROFIT < 5000 THEN 'Medium' 
    ELSE 'High' 
    END AS PROFITLEVEL 
    FROM 
    (SELECT DISTINCT ID, IDC, AMOUNT, COST 
    FROM ORDER_ITEMS 
    LEFT JOIN ORDERS 
    ON ID = IDC) 
    GROUP BY ID, IDC; 

然而,这会返回一个ORA-00905:缺少关键字的错误。

任何帮助,将不胜感激

+3

CASE语法无效。 (其中包括...)当...时出现'情况'。但是,你不能在那里使用那个列别名PROFIT ... – jarlh

+0

问题dufus标记为关闭为“由于错字或无法复制的问题” - 什么错字?这个问题怎么能不被转载? (只是问世界,因为dufus甚至不太可能记得标记关闭的问题。) – mathguy

回答

5

你正在一个错误的方式使用CASE;此外,您尝试在您定义的同一级别使用别名PROFIT

你需要编辑你CASE和使用,使该PROFIT,而不是别名PROFIT表达:

CREATE TABLE TABLE1 AS 
     SELECT ID, 
      IDC, 
      SUM(AMOUNT) PRICE, 
      SUM(COST) COST, 
      SUM(AMOUNT - COST) PROFIT, 
      CASE 
       WHEN SUM(AMOUNT - COST) < 1000 THEN 'Low' 
       WHEN SUM(AMOUNT - COST) < 5000 THEN 'Medium' 
       ELSE 'High' 
      END AS PROFITLEVEL 
     FROM (SELECT DISTINCT ID, 
           IDC, 
           AMOUNT, 
           COST 
       FROM ORDER_ITEMS LEFT JOIN ORDERS ON ID = IDC) 
    GROUP BY ID, IDC; 

您尝试使用CASE是有用的,如果你需要检查单值的方式;例如:

select level, 
     case level 
     when 1 then 'one' 
     when 2 then 'two' 
     else 'other' 
     end 
from dual 
connect by level <=3 
+0

这很有效。不知道我不能在我定义它们的同一级别使用别名。但我不明白'case when'和'case when'之间有什么区别? – Akaitenshi

+0

刚刚添加了一个小例子 – Aleksej

+0

哦,我明白了。谢谢您的帮助 – Akaitenshi