9

エイリアス列で集計関数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 
4

3 に答える 3

15

再利用したエイリアスを (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 
于 2013-08-02T15:39:32.467 に答える
5

SQLのスコープ規則では、同じでエイリアスを使用することはできませんselect。これは不合理に思えますが、次のような混乱を防ぐためです。

select 2*x as x, x+1

x2番目の変数はどちらを参照していますか?

この問題は、サブクエリを使用して解決できます。

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

結合構文も修正しました。句cross joinに制限があることを意味するコンマの使用はかなり時代遅れです。where

于 2013-01-08T15:27:46.813 に答える
0

SUM(rank)のグループ化とは異なるグループ化がない限り、これを行うことは実際には意味がありませんCOUNT(a.question_id)。それ以外の場合、SUMは常に1つの行で機能します。これは、COUNTの結果の値です。さらに、をCOUNT(a.question_id)使用するGROUPBY句をどこに指定したかを尋ねていますa.question_id。これはあなたが探している結果を返すつもりはありません。

グループ化の目的を明確にするとrank、これに対してサブクエリを作成できます。

于 2013-01-08T15:25:28.937 に答える