2013-01-08 74 views
5

如何计算别名列上的聚合函数SUM?如何计算别名列上的聚合函数SUM?

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

你可以使用子查询。祝你好运! – Kermit

+1

SUM(COUNT(a.step_id))总数。别名仅适用于GROUP BY,ORDER BY或HAVING(除直接输出外)。 –

+0

请给我例子..;) – afriex

回答

9

只需使用(SELECT别名)包住再利用别名:

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))总计不起作用 –

+0

您的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以在'SELECT(...))AS ... line_1'附近使用正确的语法 – Abhi

0

它并没有真正意义要做到这一点,除非你有SUM(rank)不同的分组比你会为COUNT(a.question_id)。否则,SUM将始终在一行上工作 - 这是COUNT结果的值。此外,您要求COUNT(a.question_id)您指定GROUP BY子句的位置也使用a.question_id。这不会返回你正在寻找的结果。

如果你澄清你的分组是rank,可以为此做一个子查询。

5

SQL的范围规则不允许您在同一个select中使用别名。虽然这看起来不合理的,它是为了防止混淆,如:

select 2*x as x, x+1 

其中x没有第二个变量是指什么?

您可以使用子查询解决这个问题:

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 

我也是固定的联接语法。使用逗号表示在where子句中有限制的cross join相当过时。