81 votes

Puis-je réutiliser un champ calculé dans une requête SELECT ?

Existe-t-il un moyen de réutiliser un champ calculé dans une instruction mysql. J'obtiens l'erreur "colonne inconnue total_sale" pour :

 SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / total_sale as f1_percent
FROM sales s

ou dois-je répéter le calcul, ce qui ferait une très longue instruction SQL si j'ajoutais tous les calculs dont j'ai besoin.

 SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (s.f1 + s.f2) as f1_percent
FROM sales s

bien sûr, je peux faire tous les calculs dans mon programme php.

64voto

Robert D Points 1522

Ce qui suit semble bien fonctionner dans mes tests sur MySQL 5.5 :

 SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (SELECT total_sale) as f1_percent
FROM sales s

14voto

OMG Ponies Points 144785

Seuls les moyens pris en charge sur plusieurs plates-formes consistent à utiliser une table dérivée/une vue en ligne :

 SELECT x.total_sale,
       x.f1 / x.total_sale as f1_percent
  FROM (SELECT s.f1,
               s.f1 + s.f2 as total_sale, 
          FROM sales s) x

8voto

AJ. Points 12912

Vous pouvez utiliser une sous-sélection :

 select tbl1.total_sale,
       tbl1.f1/tbl1.total_sale as f1_percent 
  from (select s.f1+s.f2 AS total_sale, 
               s.f1 
          from sales s) as tbl1;

5voto

kiw Points 305

Vous pouvez utiliser des sous-requêtes, comme ceci :

 SELECT 
    h.total_sale, 
    s.f1 / h.total_sale AS f1_percent
FROM sales s,
    (SELECT id, f1 + f2 AS total_sale FROM sales) h
WHERE
    s.id = h.id

Éditer: produit cartésien fixe, en supposant que la clé primaire est id . Cela devrait être équivalent à la solution d'OMG Ponies après optimisation, mais je pense que cela deviendra plus difficile à lire si vous avez besoin de plus de sous-requêtes.

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