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を文字列とみなして、それの降順で表示しちゃってるからだと思うんだけど、これを数値の降順として表示することはできるのかな?