前の記事

回答者さんのを見て、order by について調べると、
列の番号で指定したり、order by に計算式を設定したりも出来るらしい。

まず、列の番号で指定する方法。

mysql> select A,sum(C)/sum(B)*100 from hoge group by A order by 2 desc;
+--------+-------------------+
| A      | sum(C)/sum(B)*100 |
+--------+-------------------+
| 木村   |   154.54545454545 |
| 伊藤   |   109.67741935484 |
| 山田   |                40 |
+--------+-------------------+
3 rows in set (0.00 sec)

これで列に名前を付けなくても、並べ替えられた。

次に、order by に計算式を設定する場合。

mysql> select A,concat(round(sum(C)/sum(B)*100,1),"%") as RIEKIRITU from hoge group by A o
rder by sum(C)/sum(B) desc;
+--------+-----------+
| A      | RIEKIRITU |
+--------+-----------+
| 木村   | 154.5%    |
| 伊藤   | 109.7%    |
| 山田   | 40.0%     |
+--------+-----------+
3 rows in set (0.00 sec)

ただ、これ件数が多くなると2回計算される形になるから遅くなったりするのかな?

http://q.hatena.ne.jp/1199118290
とりあえず、下のような表で。

mysql> select * from hoge;
+--------+-----+-----+
| A      | B   | C   |
+--------+-----+-----+
| 木村   | 100 | 200 |
| 山田   | 100 |   0 |
| 伊藤   | 200 | 540 |
| 木村   | 120 | 140 |
| 山田   | 500 | 240 |
| 伊藤   | 420 | 140 |
+--------+-----+-----+
6 rows in set (0.00 sec)

まず、グループ化するには、group by

mysql> select A from hoge group by A;
+--------+
| A      |
+--------+
| 伊藤   |
| 山田   |
| 木村   |
+--------+
3 rows in set (0.00 sec)

グループ毎に合計するには、sum

mysql> select A,sum(B),sum(C) from hoge group by A;
+--------+--------+--------+
| A      | sum(B) | sum(C) |
+--------+--------+--------+
| 伊藤   |    620 |    680 |
| 山田   |    600 |    240 |
| 木村   |    220 |    340 |
+--------+--------+--------+
3 rows in set (0.00 sec)

利益率を求める

mysql> select A,sum(C)/sum(B)*100 from hoge group by A;
+--------+-------------------+
| A      | sum(C)/sum(B)*100 |
+--------+-------------------+
| 伊藤   |   109.67741935484 |
| 山田   |                40 |
| 木村   |   154.54545454545 |
+--------+-------------------+
3 rows in set (0.00 sec)

利益率の項目に項目名をつける。asを使う

mysql> select A,sum(C)/sum(B)*100 as RIEKIRITU from hoge group by A;
+--------+-----------------+
| A      | RIEKIRITU       |
+--------+-----------------+
| 伊藤   | 109.67741935484 |
| 山田   |              40 |
| 木村   | 154.54545454545 |
+--------+-----------------+
3 rows in set (0.00 sec)

利益率の項目が大きい順に並べ替える。order by

mysql> select A,sum(C)/sum(B)*100 as RIEKIRITU from hoge group by A order by RIEKIRITU desc;
+--------+-----------------+
| A      | RIEKIRITU       |
+--------+-----------------+
| 木村   | 154.54545454545 |
| 伊藤   | 109.67741935484 |
| 山田   |              40 |
+--------+-----------------+
3 rows in set (0.00 sec)

利益率を小数第一位で四捨五入する。round

mysql> select A,round(sum(C)/sum(B)*100,1) as RIEKIRITU from hoge group by A order by RIEKIRITU desc;
+--------+-----------+
| A      | RIEKIRITU |
+--------+-----------+
| 木村   |     154.5 |
| 伊藤   |     109.7 |
| 山田   |      40.0 |
+--------+-----------+
3 rows in set (0.00 sec)

とりあえずこれで質問者さんが必要としてるデータはでたと思う。

不明点が何個か。

order by RIEKIRITUで、利益率の項目でas で名前を付けたのを使ったけど、これは名前を付けないとorder by で指定できないのだろうか?

あと、質問者さんの求める形は、利益率に%をくっつけて表示してるんだけど、concatを使って、

mysql> select A,concat(round(sum(C)/sum(B)*100,1),"%") as RIEKIRITU from hoge group by A order by RIEKIRITU desc;
+--------+-----------+
| A      | RIEKIRITU |
+--------+-----------+
| 山田   | 40.0%     |
| 木村   | 154.5%    |
| 伊藤   | 109.7%    |
+--------+-----------+
3 rows in set (0.00 sec)

とすると、並び順がおかしくなる。。
多分に、RIEKIRITUを文字列とみなして、それの降順で表示しちゃってるからだと思うんだけど、これを数値の降順として表示することはできるのかな?

© 2011 simple blog いろいろ勉強中 Suffusion theme by Sayontan Sinha