web-dev-qa-db-fra.com

Comment utiliser une colonne calculée pour calculer une autre colonne dans la même vue

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:

  • ColonneA (Nombre)
  • ColonneB (nombre)
  • ColonneC (Nombre)

À 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é.

60
Ewaver

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 
38
Alex Poole

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
14
Manoj

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;

Démo DBFiddle


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

8
Lukasz Szozda

Vous devez inclure l'expression de votre colonne calculée:

SELECT  
ColumnA,  
ColumnB,  
ColumnA + ColumnB AS calccolumn1  
(ColumnA + ColumnB) / ColumnC AS calccolumn2
6
swirlingsara