J'ai un SELECT qui calcule deux nombres pour chaque ligne, chacun étant une colonne. Je veux ensuite diviser les deux nombres et montrer ce résultat divisé dans une troisième colonne.
Je pense que cela devrait être assez simple (je suis assez inexpérimenté avec SQL) mais je n'ai rien pu trouver dessus - peut-être que je recherche avec les mauvais mots clés.
En d'autres termes, j'aimerais que le résultat soit quelque chose comme
SELECT "Col 1", "Col 2", "Col 1"/ "Col 2" as "Col 3" FROM (SELECT (expr1) AS "Col 1", (expr2) as "Col 2")
où Col 1 et Col 2 sont tous deux des calculs coûteux et Col 3 est simplement égal à Col 2 / Col 1 . P >
Naïvement, j'écrirais cette requête comme suit:
SELECT (expr1) AS "Col 1", (expr2) as "Col 2", (expr1 / expr2) as "Col 3"
Mais ici, les deux expressions expr1 et expr2 seraient évalué deux fois. Comment puis-je stocker temporairement les valeurs de expr1 et expr2 et les utiliser pour Col 3 ?
Edit: j'étais capable de le faire avec:
Col 1 | Col 2 | Col 3 --------------------- 1 2 0.5 3 5 0.6
Est-ce la bonne façon de procéder?
3 Réponses :
Vous pouvez utiliser un CTE:
WITH CTE AS ( SELECT (expr1) AS "Col 1", (expr2) as "Col 2" FROM ... ) SELECT "Col 1", "Col 2", "Col 1" / "Col 2" AS "Col 3" FROM CTE
Utilisez un cte et cela devrait vous aider à travailler
with cte as
(...(expr1) AS "Col 1", (expr2) as "Col 2 ... )
select "Col 1", "Col 2", ("Col 1" / "Col 2") as "Col 3" from cte
Une belle méthode consiste à utiliser une jointure latérale:
SELECT v.col1, v.col2, (v.expr1 / v.expr2) as col3
FROM T CROSS JOIN LATERAL
(VALUES (expr1, expr2)) v(col1, col2);