2016-11-16 14 views
5

私は結合からテーブルを作成し、idに基づいていくつかのフィールドを合計しようとしています。この部分は素晴らしいです。私はまた、追加の列を追加しようとしているときに文を挿入したい場合に使用します。ここでGROUP BY 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が返されます:欠落キーワードエラーを。

すべてのヘルプはあなたが間違った方法でCASEを使用している

+3

無効なCASE構文です。 (他の人の中で...) 'の場合は' ... 'をします。しかし、あなたはその列エイリアスをとにかく使用することはできません... – jarlh

+0

これを「打ち切りや再現できない問題のために」マークしたdufusへの質問 - どのようなタイプミスですか?どのように問題を再現できないのですか? (世界に尋ねるのは、そのdufusがクローズの質問を覚えていても覚えていないからです。) – mathguy

答えて

5

をいただければ幸いです。また、定義するのと同じレベルでエイリアスPROFITを使用しようとします。あなたはあなたにCASEを編集して、代わりにエイリアスPROFITPROFITを与える表現を使用する必要があり

:あなたは、単一の値を確認する必要がある場合は、CASEを使用しようとした方法が有用である

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; 

を。たとえば、

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

それは機能します。私が定義したのと同じレベルでエイリアスを使用することはできません。しかし、私は「ケース・オン」とケース・イールド・オン・タイムの違いは何か分かりません。 – Akaitenshi

+0

ほんの少しの例を追加しました – Aleksej

+0

ああ、私は得ます。助けてくれてありがとう – Akaitenshi