2011-12-30 5 views
5

私は簡単な操作(select文でカウントを集計)を実行するMySQLクエリを持っていますが、結果を使用して数値演算を実行したいのですがエラーが発生します。MySQLはselectクエリで生成されたカラムを使用します

表:

id | group | count | 
----------------------------- 
1  1   3 
2  1   2 

クエリ:テーブルには本当の "合計" 欄がないので

select id, count, 
    (select sum(count) from table group by group) as total, 
    count/total as percent 
from table 

誤差があります。クエリを機能させるにはどうすればよいですか?

+1

あなたはすべてのエラーメッセージを与えていません。 – hakre

+1

申し訳ありません!私は最後の段落でそれを記述したと思ったが正式にはエラーは 'ERROR 1054(42S22): 'フィールドリスト'に 'total'がありません – MechEngineer

答えて

18

totalvariableとして保存し、除算の計算に使用することができます。

SELECT 
    `id`, `count`, 
    @total:=(SELECT sum(`count`) FROM `table` GROUP BY `group`) AS `total`, 
    `count`/@total AS `percent` 
FROM `table` 

注:GROUPは、MySQLでreserved wordです。 の場合はとし、それ以外のフィールド/テーブル名はバッククォート( `)で囲みます。

+0

BOOM、勝者があります!ありがとう、ロケット。 – MechEngineer

+0

@MechEngineer:どうぞよろしく。うれしいことに、私は助けることができます:-) –

+3

MySQLのドキュメントでは、このことを警告しています。 "一般的に、SETステートメント以外では、ユーザー変数に値を割り当てたり、同じステートメント内で値を読み取ったりしないでください。期待どおりの結果が得られるかもしれませんが、これは保証されません。 http://dev.mysql.com/doc/refman/5.7/en/user-variables.htmlを参照してください。 – PaulC

0

grouptableあるとして、あなたが好きそれを使用する必要があり、MySQLでの予約語である:

詳細について
select id, count, (select sum(count) from `table` group by `group`) as total, count/total as percent from `table` 

MySQL Reserved Words

あなたはあなたが実際にcountを使用できることがわかりますが、とにかく、すべてのテーブル名とカラム名を引用符で囲みます。

0

あなたの問題は、内部クエリが行ごとに1つの結果を生成する必要があり、すべてのグループに対して1つではないということです。 1つだけの結果が返されるように、内側のクエリでwhere句が

where inner_table.group = outer_table.group

のようなものを言って追加したいです。

2

また、変数を導入することなく、これを行うことができます。

select id, 
    count, 
    (select sum(count) from `table` group by `group`) as total, 
    (select count/total) as percent 
from `table`; 

が生成されます

+------+-------+-------+---------+ 
| id | count | total | percent | 
+------+-------+-------+---------+ 
| 1 |  3 |  5 | 0.6000 | 
| 2 |  2 |  5 | 0.4000 | 
+------+-------+-------+---------+ 
2 rows in set (0.05 sec) 
関連する問題