2013-01-08 4 views
5

Come calcolare la funzione aggregata SUM su una colonna di alias?Come calcolare la funzione aggregata SUM su una colonna di 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 
+0

Si potrebbe usare un sotto-query. In bocca al lupo! – Kermit

+1

'SUM (COUNT (a.step_id)) AS totale. Gli alias sono disponibili solo in GROUP BY, ORDER BY o HAVING (oltre all'output diretto). –

+0

per favore dammi un esempio ..;) – afriex

risposta

9

Basta avvolgere il vostro alias riutilizzato con (alias SELEZIONA):

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 
+3

'SUM (SELECT (rank)) AS totale' non funziona –

+0

Si ha un errore nella sintassi SQL; controlla il manuale che corrisponde alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'SELECT (...)) AS ... at line_1' – Abhi

0

Non ha davvero senso fare questo a meno che non si dispone di un raggruppamento diverso per SUM(rank) di quanto si farebbe per COUNT(a.question_id). In caso contrario, SUM funzionerà sempre su una riga, ovvero il valore del risultato di COUNT. Inoltre, si richiede COUNT(a.question_id) in cui è stata specificata la clausola GROUP BY per utilizzare anche a.question_id. Questo non restituirà i risultati che stai cercando.

Se si chiarisce quale sarebbe il raggruppamento per rank, è possibile creare una sottoquery per questo.

5

Le regole di ambito di SQL non consentono di utilizzare un alias nello stesso select. Anche se questo sembra irragionevole, che è quello di evitare confusioni come:

select 2*x as x, x+1 

Quali x fa la seconda variabile riferisce?

È possibile risolvere questo problema utilizzando una subquery:

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 

Ho anche sistemato la sintassi aderire. L'uso di una virgola per indicare un cross join con restrizioni nella clausola where è piuttosto obsoleto.

Problemi correlati