人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

SQL グループの平均と順位の算出方法を教えてください。


以下の様なデータベース(MYSQL)の構造になっている時に、各社の平均収入(income)のランク付けができるSQLを教えてください。

+---------+----------------+
| name | income |
+---------+----------------+
| C社 | 100|
| C社 | 30|
| C社 | 50|
| B社 | 70|
| A社 | 60|
| A社 | 50|
+---------+----------------+


結果

name income rank
A社 55 3位
B社 70 1位
C社 60 2位

●質問者: jamis
●カテゴリ:ウェブ制作
○ 状態 :キャンセル
└ 回答数 : 1/1件

▽最新の回答へ

1 ● うぃんど

一例

--サンプルデータの準備
CREATE TEMPORARY TABLE `テーブル名`(name text, income int);
INSERT INTO `テーブル名` VALUES ('C社',100),('C社',30),('C社',50),('B社',70),('A社',60),('A社',50);

--求めるクエリ
SET @n:=0;
SELECT *, @n:= @n + 1 AS rank
FROM (
 SELECT name , avg(income) AS income
 FROM `テーブル名`
 GROUP BY name
 ORDER BY income DESC
) AS t
;

結果

nameincomerank
B社70.00001
C社60.00002
A社55.00003

ソート順変更バージョン

SET @n:=0;
SELECT *
FROM (
 SELECT *, @n:= @n + 1 AS rank
 FROM (
 SELECT name , avg(income) AS income
 FROM `テーブル名`
 GROUP BY name
 ORDER BY income DESC
 ) AS t
) AS tt
ORDER BY name
;

結果

nameincomerank
A社55.00003
B社70.00001
C社60.00002

jamisさんのコメント
回答ありがとうございます。 なるほど、変数でランク付けしているんですね。 ただ、順位にタイが発生した場合に問題が出ますね。

うぃんどさんのコメント
質問文に無い条件の後付けを認めるときりがないので、追加のコードは書きません。 誰かが通りがかるのを待つか、キャンセルしてくださいな。 質問をやりなおすなら「問題が出ますね」などとあいまいで嫌味たらしい返信をしたりせず、 自分が求めるものを最初からしっかりと書くと良いでしょう。 ついでに、 回答拒否リストに id:windofjuly を入れといてもらえると助かります。 では、さようなら。

jamisさんのコメント
嫌な思いをさせたのなら、申し訳ないです。 追加のコードを求めたり、嫌みを言うつもりなどはなかったのですが。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ