J'espère que vous pouvez aider avec cette question. J'utilise Oracle SQL (développeur SQL pour cette vue) ...
Si j'ai une table avec les colonnes suivantes:
À mon avis j'ai
Select
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1
Maintenant, je veux utiliser calccolumn1 mais je ne peux pas simplement dire ...
Select
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1
calccolumn1 / ColumnC as calccolumn2
Je suppose que j'ai besoin d'un certain type de sous-requête ... mais c'est là que j'ai besoin de votre aide ... Comment pourrais-je utiliser Word pour interroger la requête afin de pouvoir utiliser calccolumn1 dans un autre calcul de la même requête? Ce pourrait être un If alors ou un Cas quand, mais en bout de ligne c'est un nombre dérivé.
Vous pouvez utiliser une requête imbriquée:
Select
ColumnA,
ColumnB,
calccolumn1,
calccolumn1 / ColumnC as calccolumn2
From (
Select
ColumnA,
ColumnB,
ColumnC,
ColumnA + ColumnB As calccolumn1
from t42
);
Avec une ligne avec les valeurs 3
, 4
, 5
qui donne:
COLUMNA COLUMNB CALCCOLUMN1 CALCCOLUMN2
---------- ---------- ----------- -----------
3 4 7 1.4
Vous pouvez aussi simplement répéter le premier calcul, à moins que cela ne coûte vraiment cher (via un appel de fonction, par exemple):
Select
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1,
(ColumnA + ColumnB) / ColumnC As calccolumn2
from t42;
COLUMNA COLUMNB CALCCOLUMN1 CALCCOLUMN2
---------- ---------- ----------- -----------
3 4 7 1.4
Dans Sql Server
Vous pouvez le faire en utilisant 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
Si vous souhaitez faire référence à une colonne calculée sur le "même niveau de requête", vous pouvez utiliser 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;
Requete:
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;
Veuillez noter que l'expression de CROSS APPLY/OUTER APPLY
est également disponible dans d'autres clauses:
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 ...;
Cette approche permet d’éviter de placer une requête entière dans une requête externe ou de copier/coller la même expression à plusieurs endroits (avec une requête complexe, il pourrait être difficile à maintenir).
Article associé: Fonctionnalité la plus manquante du langage SQL
Vous devez inclure l'expression de votre colonne calculée:
SELECT
ColumnA,
ColumnB,
ColumnA + ColumnB AS calccolumn1
(ColumnA + ColumnB) / ColumnC AS calccolumn2