個人事業主の方必見!確定申告のお悩み解決

アンケート結果を集計する効率の良いシンプルなSQLを教えて下さい。

MySQLで、以下の状態です。

テーブル名:hoge
カラム:id,kbn
id...auto
kbn...1~5

欲しい結果は、以下の状態です。
順位,kbn,count
1位,5,60ポイント
2位,3,45ポイント
2位,1,45ポイント
4位,4,30ポイント
5位,2,10ポイント

※位やポイントはプログラム側で付与するので不要です。

2位の様に同点の場合は同じ順位を表示し、3位を飛ばし順位を表示させたく思います。

どうぞ、よろしくお願い致します。

A 回答 (2件)

手っ取り早いのは一度ビューを作ることです。



//準備
create table hoge(id int not null auto_increment primary key,kbn int);
insert into hoge(kbn) values(1),(2),(3),(4),(5),(1),(1),(2),(4),(5),(3),(1),(2),(5),(5),(3),(2),(1);

//ビューの作成
create view vhoge as select kbn,count(*) as cnt from hoge group by kbn;

//集計
select kbn,cnt,(select count(*)+1 from vhoge as v2 where v1.cnt<v2.cnt) as rank from vhoge as v1 order by rank asc;

※もしビューを使いたくないのであればビューに書いたのと同様のSQLをそのまま書きます

select kbn,cnt,(select count(*)+1 from (select kbn,count(*) as cnt from hoge group by kbn) as v2 where v1.cnt<v2.cnt) as rank from (select kbn,count(*) as cnt from hoge group by kbn) as v1 order by rank asc
    • good
    • 0
この回答へのお礼

yambejp 様

ご回答ありがとうございます。

教えて頂きました、SQL(今回はビューを使わないタイプを利用させて頂きました)で意図する動きのプログラムが実装出来ました。

サンプルデータまで、作成して頂き誠にありがとうございました。

教えて頂いたSQLを1つ1つを理解し、今後の勉強にも役立てていこうと思います。

本当にありがとうございました。

お礼日時:2015/01/19 19:10

hogeテーブルにはカラムid,kbnしかありませんが


countはどうやって拾う仕様でしょうか?
例えばkbn=5がhogeテーブルに、60レコードあるということでしょうか?
その方法だとレコード数が0のデータは拾えませんが別途ユーザー(?)管理テーブルは
あるのでしょうか?

ランク付け自体は定番のSQLがありますので
countさえわかればそれほど難しくはないです

この回答への補足

ご回答ありがとうございます。

>例えばkbn=5がhogeテーブルに、60レコードあるということでしょうか?

お察しの通りでございます。kbnを引数にしinsertする仕様となっております。

kbn自体には、別途管理テーブルをもっていますが、今回はレコード数が0の場合は表示されなくても問題はありません。

情報が不足していて申し訳ありません。

SQLに関しては勉強中ですが急遽必要になってしまい、今の私の実力では実装できそうもありませんので、お手数ですが、お力添えを願いたく思います。

補足日時:2015/01/19 14:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q接続ができません

MySQLに接続するため、コマンドラインで
>mysql -u root
と入力したのですが
ERROR 2003:Can't connect to MySQL server on 'localhost'(10061)
とエラーが出て接続できません。

また、
>mysqladmin -u root password '********'
>mysql -u root -p
もやってみたのですが、
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to MySQL server on 'localhost' (10061)'
Check that mysqld is running on localhost and that the port is 3306.
You can check this by doing 'telnet localhost 3306'
とエラーが出てしまいます。

前に同じ質問があったのですが解決されていなかったので、
再度質問させていただきました。
よろしくお願いしますm(_ _)m

OSはWindowsXPです

MySQLに接続するため、コマンドラインで
>mysql -u root
と入力したのですが
ERROR 2003:Can't connect to MySQL server on 'localhost'(10061)
とエラーが出て接続できません。

また、
>mysqladmin -u root password '********'
>mysql -u root -p
もやってみたのですが、
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to MySQL server on 'localhost' (10061)'
Check that mysqld is running on localhost and that the port is 3306.
You can check this by doin...続きを読む

Aベストアンサー

MySQLのバージョンとか、もし本を見ているなら何の本なのかとか、設定はどのようにしているとか、そういう除法がないと回答できません。

接続できない原因については、エラーメッセージからして、そもそもMySQLが起動していないものと思われます。
起動しないと(起動できるようにしない)とダメです。
恐らく、設定ファイルに間違いがあってMySQLが起動してないんでしょう。
設定ファイルを見直してみましょう。

※インストール先がC:\mysql以外の場合、後で設定ファイルの basedir でパスを指定する必要があるはずなので、そこら辺も。

もし起動しているなら、ポートがLISTENになっているか確認してみましょう。
コマンドプロンプトで
netstat -an
して、エラーメッセージに出ているポート番号10061,3306がLISTENになっているかどうか確認してみましょう。

パーソナルファイアウォールなどの設定で、ポートがふさがれている可能性もあるのかもしれませんが、色々試してみてください。

以上、随分前にMySQLを触っただけなので、最近の動向はあまり押さえてませんが、参考になれば幸いです。

MySQLのバージョンとか、もし本を見ているなら何の本なのかとか、設定はどのようにしているとか、そういう除法がないと回答できません。

接続できない原因については、エラーメッセージからして、そもそもMySQLが起動していないものと思われます。
起動しないと(起動できるようにしない)とダメです。
恐らく、設定ファイルに間違いがあってMySQLが起動してないんでしょう。
設定ファイルを見直してみましょう。

※インストール先がC:\mysql以外の場合、後で設定ファイルの basedir でパスを指定する必要...続きを読む


人気Q&Aランキング