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位

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/02/01 10:25:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

一例

--サンプルデータの準備
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
他1件のコメントを見る
id:windofjuly

質問文に無い条件の後付けを認めるときりがないので、追加のコードは書きません。
誰かが通りがかるのを待つか、キャンセルしてくださいな。

質問をやりなおすなら「問題が出ますね」などとあいまいで嫌味たらしい返信をしたりせず、
自分が求めるものを最初からしっかりと書くと良いでしょう。

ついでに、
回答拒否リストに id:windofjuly を入れといてもらえると助かります。

では、さようなら。

2014/02/01 08:08:12
id:jamis

嫌な思いをさせたのなら、申し訳ないです。
追加のコードを求めたり、嫌みを言うつもりなどはなかったのですが。

2014/02/01 08:28:34

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません