So verwenden Sie eine berechnete Spalte, um eine andere Spalte in derselben Ansicht zu berechnen

76

Ich hoffe, Sie können bei dieser Frage helfen. Ich verwende Oracle SQL (SQL Developer für diese Ansicht) ...

Wenn ich eine Tabelle mit folgenden Spalten habe:

  • Spalte A (Nummer)
  • Spalte B (Nummer)
  • Spalte C (Nummer)

Meiner Ansicht nach habe ich

Select  
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1

Jetzt möchte ich calccolumn1 verwenden, aber ich kann nicht einfach sagen ...

Select  
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1
calccolumn1 / ColumnC as calccolumn2

Ich gehe davon aus, dass ich eine Art Unterabfrage benötige. Aber hier brauche ich Ihre Hilfe. Wie würde ich die Abfrage formulieren, damit ich calccolumn1 in einer anderen Berechnung innerhalb derselben Abfrage verwenden kann? Es kann ein Wenn dann oder ein Fall wann sein, aber unter dem Strich handelt es sich um eine abgeleitete Zahl.

Ewaver
quelle
1
Gibt es einen Grund, dies nicht einfach zu tun (ColumnA + ColumnB) / ColumnC As calccolumn2?
Alex Poole
4
Ich stimme zu ... in diesem vereinfachten Beispiel ... das würde gut funktionieren. Ich habe versucht, zu dem Konzept zu gelangen, wie ich ein vereinfachtes Beispiel formatieren würde, um es auf ein komplexeres anzuwenden. Wenn also ColumnA ein komplexer Fall wäre, wenn Anweisung und ColumnB auch ... dann, wenn ich sie kombinieren möchte produziere calccolumn1 und verwende es später für calccolumn2. Würde ich einfach den gesamten Fallstatus für Spalte A in () und den gleichen für B einfügen und sie hinzufügen?
Ewaver
1
@AlexPoole Ein komplexer Ausdruck auf derselben Ebene kann nützlich sein. Eine einzelne Definition ist einfacher zu pflegen als über mehrere Stellen zu kopieren. Es ist machbar mitCROSS APPLY approach
Lukasz Szozda
Natürlich zeigte die Frage keinen komplexen Ausdruck. Ich wollte sagen, dass Cross Apply nicht verfügbar war, als die Frage gestellt wurde, aber 12c war bis dahin einige Monate aus, ich war mir dessen einfach nicht bewusst ... Der Subquery-Ansatz wiederholt es jedoch auch nicht.
Alex Poole
@AlexPoole An der Inline-Ansicht / dem CTE-Ansatz ist nichts auszusetzen. Ich wollte nur zeigen, dass es möglich ist, komplexe Ausdrücke auf derselben Abfrageebene wie alternativ zu haben.
Lukasz Szozda

Antworten:

51

Sie können eine verschachtelte Abfrage verwenden:

Select
  ColumnA,
  ColumnB,
  calccolumn1,
  calccolumn1 / ColumnC as calccolumn2
From (
  Select
    ColumnA,
    ColumnB,
    ColumnC,
    ColumnA + ColumnB As calccolumn1
  from t42
);

Mit einer Reihe mit Werten 3, 4, 5das gibt:

   COLUMNA    COLUMNB CALCCOLUMN1 CALCCOLUMN2
---------- ---------- ----------- -----------
         3          4           7         1.4

Sie können die erste Berechnung auch einfach wiederholen, es sei denn, sie erledigt wirklich etwas Teueres (z. B. über einen Funktionsaufruf):

Select
  ColumnA,
  ColumnB,
  ColumnA + ColumnB As calccolumn1,
  (ColumnA + ColumnB) / ColumnC As calccolumn2
from t42; 

   COLUMNA    COLUMNB CALCCOLUMN1 CALCCOLUMN2
---------- ---------- ----------- -----------
         3          4           7         1.4 
Alex Poole
quelle
17

In SQL Server

Sie können dies mit tun cross apply

Select
  ColumnA,
  ColumnB,
  c.calccolumn1 As calccolumn1,
  c.calccolumn1 / ColumnC As calccolumn2
from t42
cross apply (select (ColumnA + ColumnB) as calccolumn1) as c
Manoj
quelle
12

Wenn Sie auf eine berechnete Spalte auf "derselben Abfrageebene" verweisen möchten, können Sie Folgendes verwenden: CROSS APPLY(Oracle 12c):

--Sample data:
CREATE TABLE tab(ColumnA NUMBER(10,2),ColumnB NUMBER(10,2),ColumnC NUMBER(10,2));

INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (2, 10, 2);
INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (3, 15, 6);
INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (7, 14, 3);
COMMIT;

Abfrage:

SELECT
  ColumnA,
  ColumnB,
  sub.calccolumn1,
  sub.calccolumn1 / ColumnC AS calccolumn2
FROM tab t
CROSS APPLY (SELECT t.ColumnA + t.ColumnB AS calccolumn1 FROM dual) sub;

DBFiddle Demo


Bitte beachten Sie, dass der Ausdruck von CROSS APPLY/OUTER APPLYauch in anderen Abschnitten verfügbar ist:

SELECT
  ColumnA,
  ColumnB,
  sub.calccolumn1,
  sub.calccolumn1 / ColumnC AS calccolumn2
FROM tab t
CROSS APPLY (SELECT t.ColumnA + t.ColumnB AS calccolumn1 FROM dual) sub
WHERE sub.calccolumn1 = 12;
-- GROUP BY ...
-- ORDER BY ...;

Dieser Ansatz ermöglicht es zu vermeiden, die gesamte Abfrage mit einer äußeren Abfrage zu versehen oder denselben Ausdruck an mehreren Stellen zu kopieren / einzufügen (bei einer komplexen kann es schwierig sein, sie zu pflegen).

In Verbindung stehender Artikel: Die am meisten fehlende Funktion der SQL-Sprache

Lukasz Szozda
quelle
7

Sie müssen den Ausdruck für Ihre berechnete Spalte angeben:

SELECT  
ColumnA,  
ColumnB,  
ColumnA + ColumnB AS calccolumn1  
(ColumnA + ColumnB) / ColumnC AS calccolumn2
Swirlingsara
quelle
Oder Sie könnten eine gespeicherte Prozedur zur Ausgabe der Spalte calcolumn1 erstellen
swirlingsara
Dies ist nur eine Kopie eines Teils einer vorherigen Antwort.
Mark Schultheiss
0

In SQL Server

können Sie dies mit With CTE tun

WITH common_table_expression (Transact-SQL)

CREATE TABLE tab(ColumnA DECIMAL(10,2), ColumnB DECIMAL(10,2), ColumnC DECIMAL(10,2))

INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (2, 10, 2),(3, 15, 6),(7, 14, 3)

WITH tab_CTE (ColumnA, ColumnB, ColumnC,calccolumn1)  
AS  
(  
Select
    ColumnA,
    ColumnB,
    ColumnC,
    ColumnA + ColumnB As calccolumn1
  from tab
)  

SELECT
  ColumnA,
  ColumnB,
  calccolumn1,
  calccolumn1 / ColumnC AS calccolumn2
FROM  tab_CTE

DBFiddle Demo

Vahid Heydarinezhad
quelle