2013-01-08 6 views
5

Jak obliczyć sumaryczną funkcję SUMA w kolumnie alias?Jak obliczyć sumaryczną funkcję SUMA w kolumnie 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

Można użyć sub-zapytania. Powodzenia! – Kermit

+1

'SUMA (COUNT (a.step_id)) AS total'. Aliasy są dostępne tylko w GROUP BY, ORDER BY lub HAVING (oprócz bezpośredniego wyjścia). –

+0

proszę podać przykład ..;) – afriex

Odpowiedz

9

Wystarczy owinąć ponownie wykorzystane alias z (Wybierz 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 
+3

'SUMA (WYBIERZ (pozycja)) AS total' nie działa –

+0

Masz błąd w swojej składni SQL; sprawdź instrukcję, która odpowiada twojej wersji serwera MySQL dla właściwej składni do użycia w pobliżu 'SELECT (...)) AS ... at line_1' – Abhi

0

To naprawdę nie ma sensu tego robić, chyba że masz inną ugrupowanie SUM(rank) niż byłoby dla COUNT(a.question_id). W przeciwnym razie SUM zawsze będzie działał na jednym wierszu - co jest wartością wyniku COUNT. Co więcej, pytasz o numer COUNT(a.question_id), w którym określono klauzulę GROUP BY, aby również użyć a.question_id. Nie zwróci to wyników, których szukasz.

Jeśli wyjaśnisz, jakie jest twoje grupowanie dla rank, można do tego wykonać podzapytanie.

5

Reguły skalowania SQL nie pozwalają na użycie aliasu w tym samym select. Chociaż wydaje się nierozsądne, to aby uniknąć nieporozumień, takich jak:

select 2*x as x, x+1 

Które x ma drugi odnosi się do zmiennej?

Można rozwiązać ten problem za pomocą podzapytania:

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 

ja również stałe składnię przyłączenia. Użycie przecinka w znaczeniu cross join z ograniczeniami w klauzuli where jest raczej nieaktualne.