2016-11-16 200 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