9 votes

Comment calculer la fonction d'agrégation SUM sur une colonne alias ?

Comment calculer la fonction d'agrégation SUM sur une colonne alias ?

SELECT a.question_id, 
       a.level, 
       Count(a.question_id) AS rank, 
       Sum(rank)        AS total 
FROM   logs AS a, 
       question AS b 
WHERE  a.question_id = b.q_id 
       AND a.level = '2' 
GROUP  BY a.question_id 
ORDER  BY rank DESC

14voto

zessx Points 17769

Il suffit d'envelopper votre alias réutilisé avec (SELECT alias) :

SELECT a.question_id, 
       a.level, 
       COUNT(a.question_id) AS rank, 
       SUM(SELECT(rank)) AS total 
FROM   logs AS a, 
       question AS b 
WHERE  a.question_id = b.q_id 
       AND a.level = '2' 
GROUP  BY a.question_id 
ORDER  BY rank DESC

6voto

Gordon Linoff Points 213350

Les règles de scoping de SQL ne vous permettent pas d'utiliser un alias dans le même fichier. select . Bien que cela semble déraisonnable, il s'agit d'éviter des confusions telles que :

select 2*x as x, x+1

Quel x la deuxième variable se réfère-t-elle à ?

Vous pouvez résoudre ce problème en utilisant une sous-requête :

select t.*, Sum(rank) AS total 
from (SELECT a.question_id, a.level, Count(a.question_id) AS rank, 
      FROM logs AS a join
           question AS b 
           on a.question_id = b.q_id 
      WHERE a.level = '2' 
      GROUP  BY a.question_id 
     ) t
ORDER BY rank DESC

J'ai également corrigé la syntaxe de votre jointure. L'utilisation d'une virgule pour signifier une cross join avec des restrictions dans le where clause est plutôt dépassée.

0voto

PinnyM Points 23998

Cela n'a pas vraiment de sens de faire cela, sauf si vous avez un regroupement différent pour SUM(rank) que vous le feriez pour COUNT(a.question_id) . Sinon, la SOMME travaillera toujours sur une ligne - qui est la valeur du résultat de COUNT. De plus, vous demandez COUNT(a.question_id) où vous avez spécifié la clause GROUP BY pour utiliser également a.question_id . Cela ne donnera pas les résultats que vous recherchez.

Si vous précisez quel serait votre regroupement pour rank une sous-requête pourrait être faite pour cela.

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