59 votes

Comment réutiliser une colonne de résultat dans une expression pour une autre colonne de résultat

Exemple:

 SELECT
   (SELECT SUM(...) FROM ...) as turnover,
   (SELECT SUM(...) FROM ...) as cost,
   turnover - cost as profit

Bien sûr, ce n'est pas valide (au moins dans Postgres) mais comment obtenir la même chose dans une requête sans réécrire deux fois la sous-requête ?

50voto

Denis Points 34131

Ainsi:

 SELECT
   turnover,
   cost,
   turnover - cost as profit
from (
   (SELECT SUM(...) FROM ...) as turnover,
   (SELECT SUM(...) FROM ...) as cost
   ) as partial_sums

15voto

Alex Calugarescu Points 582

Vous pouvez réutiliser la requête comme ceci :

 WITH 
  TURNOVER AS (
    SELECT SUM(...) FROM ...)
  ),
  COST AS(
    SELECT SUM(...) FROM ...
  )

SELECT *
FROM(
 SELECT
   TURNOVER.sum as SUM_TURNOVER
 FROM
 TURNOVER,COST
 WHERE ....
) AS a

Cela équivaut à :

 SELECT *
FROM(
 SELECT
   TURNOVER.sum as SUM_TURNOVER
 FROM
 (
   SELECT SUM(...) FROM ...)
 )AS TURNOVER,
 (
   SELECT SUM(...) FROM ...
 )AS COST
 WHERE ....
) AS a

Il y a un point à noter ici. La première méthode est plus lisible et réutilisable, mais la seconde méthode peut être plus rapide, car la base de données peut choisir un meilleur plan pour cela.

6voto

andrers52 Points 176

Peut-être que la clause sql "with" pourrait aider, comme présenté ici http://orafaq.com/node/1879 (d'autres bases de données telles que Postgres le font également, pas seulement Oracle).

5voto

Eric.K.Yung Points 1075
SELECT turnover, cost, turnover - cost
FROM
(
SELECT
(SELECT ...) as turnover,
(SELECT ...) as cost
) as Temp

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X