2016-11-16 27 views
5

Ich versuche, eine Tabelle aus einem Join zu erstellen und einige Felder basierend auf ID summieren. Dieser Teil funktioniert super. Ich versuche auch, eine zusätzliche Spalte hinzuzufügen und eine Groß-/Kleinschreibung zu verwenden, wenn ich die Anweisung füllen möchte.GROUP BY nach CASE WHEN

Hier ist das Skript

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; 

Dies jedoch gibt eine ORA-00905: Fehlendes Schlüsselwort Fehler.

Jede Hilfe wäre

+3

Ungültige CASE-Syntax. (Unter anderem ...) "Fall wenn ...". Aber Sie können diesen Spaltenalias PROFIT dort eh nicht verwenden ... – jarlh

+0

Frage an den Dufus, der dies für das Schließen als "wegen eines Tippfehlers oder eines Problems, das nicht reproduziert werden kann" markiert - Was Tippfehler? Wie kann das Problem nicht reproduziert werden? (Frage nur die Welt, da dieser Dufus sich sehr wahrscheinlich gar nicht daran erinnert, die Frage zum Schließen zu markieren.) – mathguy

Antwort

5

Sie verwenden die CASE in einer falschen Weise geschätzt werden; Außerdem versuchen Sie, den Alias ​​PROFIT auf derselben Ebene zu verwenden, die Sie definieren.

Sie benötigen Sie CASE und verwenden den Ausdruck zu bearbeiten, die die PROFIT anstelle des Alias ​​gibt 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; 

Die Art und Weise zu verwenden, versucht die CASE nützlich, wenn Sie einzelne Werte überprüfen müssen; Beispiel:

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

Das funktioniert. Ich wusste nicht, dass ich Aliase auf der gleichen Ebene wie ich sie definieren kann. Aber ich verstehe nicht, was ist der Unterschied zwischen "Fall wann" und "Fall Gewinn wann"? – Akaitenshi

+0

Nur ein kleines Beispiel hinzugefügt – Aleksej

+0

Oh ich bekomme. Danke für die Hilfe – Akaitenshi