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.
(ColumnA + ColumnB) / ColumnC As calccolumn2
?CROSS APPLY approach
Antworten:
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
,5
das 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
quelle
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
quelle
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 APPLY
auch 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
quelle
Sie müssen den Ausdruck für Ihre berechnete Spalte angeben:
SELECT ColumnA, ColumnB, ColumnA + ColumnB AS calccolumn1 (ColumnA + ColumnB) / ColumnC AS calccolumn2
quelle
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
quelle