- ベストアンサー
各クラスの上位2名SQL
クラス|出席番号|点数 1 |1 |77 1 |2 |88 1 |3 |40 2 |1 |75 2 |2 |83 2 |3 |33 3 |1 |22 3 |2 |55 3 |3 |66 上記のようなデータがある場合に各クラスの上位2名(計6名)を選出するSQLを教えて下さい。
- muuming2001
- お礼率68% (711/1039)
- その他(データベース)
- 回答数3
- ありがとう数4
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
前回のSQL、タイプミスしてました。 下記に訂正します。 select * from table_name as t1 where 出席番号 in ( select 出席番号 from table_name as t2 where t1.クラス = t2.クラス order by 点数 desc limit 2); 動作確認もしました。下記で確認してください。 http://sqlfiddle.com/#!15/d2f72/1 あるいは、クラスが3つだけなら、union でマージしてもいいですね。 (select * from table_name where クラス = 1 order by 点数 desc limit 2) union all (select * from table_name where クラス = 2 order by 点数 desc limit 2) union all (select * from table_name where クラス = 3 order by 点数 desc limit 2) ;
その他の回答 (2)
- hatena1989
- ベストアンサー率87% (378/433)
PostgreSQL なら、下記でどうでしょうか。(動作確認はしてません。) Top 2 を limit 2 に変更しただけですが。 select * from table_name as t1 where 出席番号 in (select 出席番号 as t2 from where t1.クラス = t2.クラス order by 点数 desc limit 2);
お礼
ありがとうございます。 出席番号はユニークでは無いため、多分だめのような気がします。 (動作確認はしてません。)
- hatena1989
- ベストアンサー率87% (378/433)
データベースが何か分かりませんが、SQL Server か Access なら とりあえず下記でどうでしょうか。 SELECT A.* FROM テーブル名 A WHERE A.出席番号 In (SELECT TOP 2 出席番号 FROM テーブル名 B WHERE A.クラス=B.クラス ORDER BY 点数 DESC);
お礼
postgresを想定しています。 自己レスですが。。。 select * from table_name where (クラス, 出席番号) in ( (select クラス,出席番号 where クラス = 1 order by 点数 desc limit 2) union (select クラス,出席番号 where クラス = 2 order by 点数 desc limit 2) union (select クラス,出席番号 where クラス = 3 order by 点数 desc limit 2) ); こんな風に思いつきました
関連するQ&A
- Excelで上位だけ表示
過去質問にもあったのですが、他の方法はないのかと思いまして質問させてください…。今日昨日はじめたばっかりのド素人なので過去質問読みましたが理解できませんでした;; まず、表で、 出席番号・名前・点数・順位(1 山田太郎 435 1など) を表示して、その下に上位3人のデータを表示するというものです。 自分でVLOOKUPを使ってどうにかしようとしたのですが、色々やってみたものの失敗続きでして... VLOOKUPとLARGEあたりでできますでしょうか? 順位はRANKで表示しています
- ベストアンサー
- オフィス系ソフト
- Microsoft AccessのSQL 抽出についての質問
Microsoft AccessのSQL 抽出についての質問 今は手元にこのソフトがないのですが、 例えば、 <成績データ> 社員番号 名前 点数 0701 大橋 68 0702 田中 54 0703 斎藤 82 0704 松本 73 こんな感じのデータがあったとして、80点以上の人を抽出する場合、 そのSQL文っていうのはどうすればいいのでしょうか? SELECT ??? FROM 成績データ WHERE 点数>=80 って感じだと自分は考えているのですが、 これで正しいでしょうか?というかSELECTのところに何をいれればいいのかよくわかりません 教えてください。
- ベストアンサー
- その他MS Office製品
- 特定の人の最高を出すようなSQL
例えば単純化して 出席番号と点数と登録時刻を登録すようなテーブルにて seiseki table bangou int //出席番号 tensu int //点数 instime timestamp//登録時刻 出席番号1番の人が20 点 25点 40点という成績を順にとって 1 20 2014-01-04 1 40 2014-03-20 1 25 2014-05-11 とレコードがあった場合 一番点数がよいレコードの登録期日を求めるにはどうやったらよいでしょか・・・
- ベストアンサー
- PostgreSQL
- 上位ディレクトリ名(フォルダ名)を取得するには?
phpファイルが入っている、2階層上位のディレクトリ名(フォルダ名)を取得したいと思っています。 例 http://~.com/aaa/bbb/ccc/test.php test.phpが本体です。 ここから2階層上位のディレクトリ名、ここでは「bbb」を取得するような事はできないでしょうか? test.phpの中に、2階層上位のディレクトリ名を記述したいと思っています。 具体的に言うと、 $name = "●●●"; 上記の●●●に、2階層上位のディレクトリ名を入れたいです。 同じようなファイルが多数あり、「bbb」には様々なフォルダ名があり、test.phpの1つ1つを書き換えるのに手間がかかるので、ディレクトリ名を自動的に取得できれば助かります。 phpの知識がほとんどないため、お力をお借りできればと思い、質問させて頂きました。 アドバイスをお願い致します。
- ベストアンサー
- PHP
- SQL文でフィールド名に空白を含んでいるとき
CSVファイル検索の際のSQL文のことですが、フィールド名に半角空白を含んでいるものがあります。この場合の書き方についてアドバイスいただけないでしょうか。 例 where 科目 = keyword 上記の科目に 「未 払 金」のように空白を含んだものがある。 #Replaceは違うようで・・。レコードに空白があるのならわかりますが・・。 #上記SQL文は簡単にしてあり、そのままの書き方ではありません。
- ベストアンサー
- その他(データベース)
- 検索SQLについて
SQL初心者です。 SQL文1つで以下のようなことをしたいんですが いい方法が思いつかなくて大変困ってします。 いい方法がありましたら教えてください。 以下のようなデータがあるとして 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品AAA、2004/10/10、2 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000002、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 00000003、商品AAA、2004/10/10、1 電話番号と商品名が同じ場合は (1)日付(降順) (2)数量(昇順) の順に比較して1つだけに絞って取得したい 「取得結果」 電話番号、商品名 、日付 、数量 00000001、商品AAA、2004/10/10、1 00000001、商品BBB、2004/10/10、1 00000002、商品AAA、2004/10/09、2 00000003、商品AAA、2004/10/10、1 よろしくお願いします。
- ベストアンサー
- Oracle
- SQLについて教えてください。
SQLについて質問があります。 あるテーブルの項目が、倉庫名、商品名、在庫数量とあった場合、 違う倉庫にある同一商品が数件あったとします。 例えば、 A倉庫 商品●● 10個 B倉庫 商品●● 20個 C倉庫 商品●● 5個 A倉庫 商品×× 3個 B倉庫 商品×× 15個 C倉庫 商品×× 0個 上記のような場合、●●商品についてはどれも在庫が1個以上 あるので通常に3件取得したいのですが、××商品はC倉庫が在庫0個です。 上記の様に0個の件数が1件でもあったら、その商品については 取得しない様なSQL式を1発で組むことは可能でしょうか? (上記の例の場合、●●商品3件のみ取得したい) 何故、SQL初心者で初歩的な質問で申し訳ありませんが よろしくお願い致します。
- 締切済み
- SQL Server
- MySQLで変数やループ、上位3名を求める方法
お世話になります。早乙女遙佳と申します。 Webサイト上から会員名や点数を入力し、 送信ボタンが押されると、 受け取ったCGI側でDBに書き込み、 今月成績の良かった方、上位3名は○○さんと○○さんと○○さんです というサイトを作りたいと思っています。 データベースは、MySQLを使って学習していますが、 教えていただけますでしょうか? scoreテーブルとして、以下のテーブルを作っています。 会員の毎月の点数と、先月からの点数の増加分を格納するテーブルです。 ID name score month increment 1 taro 100 11 0 2 jiro 200 11 0 3 taro 50 10 0 4 jiro 250 10 0 /* 今月の点数を求める */ SELECT score AS thisMonthScore FROM `score` WHERE name = 'taro' AND MONTH = '11'; /* 先月の点数を求める */ SELECT score AS prevMonthScore FROM `score` WHERE name = 'taro' AND MONTH = '10'; /* 点数の増加分を書き込む */ UPDATE `score` SET `increment`= 50 WHERE name = 'taro' and month = '11'; 質問1 上記のUPDATE文では、増分を書き込むために、 `increment`= 50 としていますが、 upScore = thisMonthScore - prevMonthScore `increment`= upScore のように書けたらと思うのですが、できないものでしょうか? 質問2 WHERE name = 'taro' の様に各会員の氏名を書いていますが、 「すべての会員についてループさせる」 様にはできないでしょうか? 擬似コードですが memberName = select name from `score`; //会員名の配列 memberCount = select count('name') as cnt from `score`; //会員数 for (i = 0; i < memberCount; i++){ thisMonthScore = SELECT score AS thisMonthScore FROM `score` WHERE name = memberName[i] AND MONTH = '11'; //今月の点数 prevMonthScore = SELECT score AS prevMonthScore FROM `score` WHERE name = memberName[i] AND MONTH = '10'; //先月の点数 upScore = thisMonthScore - prevMonthScore; //点数の増加分 UPDATE `score` SET `increment`= upScore WHERE name = memberName[i] and month = '11'; //DBの更新 } のようなイメージです。 DBの呼び出し元であるCGIでループを書けばもちろんできるのですが、 SQL文で処理させた方が速いのかなとも思ったりもしたのですが、 通常、どのように書くものでしょうか? 毎月100件、1年で1000件、10年分で10000件くらいのレコード数になりますが、このくらいであればあまり速度などは気にせずとも良いものでしょうか? 質問3 成績の良かった方、上位3名を抽出するにはどのようなSQL文になるでしょうか? 第一位 taroさん 50点 第二位 jiroさん -50点 第三位 saburoさん -100点 のような感じです。 初歩的な質問で恐縮ですが、 どうぞ、よろしくお願いします。
- ベストアンサー
- MySQL
- SQL内での計算に関して
SQLでこんな事ができないかと考えています。 実際のデータの内容として、発注データと仕入データが存在し、結果として 発注残の数量を拾いたいと考えています。 1、発注データ 発注番号、品名、数量・・・・ 2、仕入データ 仕入番号、発注番号、数量・・・・ ※ 仕入は分納もある為、1つの発注番号に対し、複数データが存在します。 結果として、 発注番号、発注残数量 これらを繋ぎ合わせ、なんとか1つのSQLで発注残が取得できないかと 考えていますが、不可能でしょうか? これをプログラムで作成する事は可能かと思われますが、かなりボリュームが 大きくなってしまう為、SQLでなんとかならないかと考えています。 教えて下さい。 よろしくお願いします。
- ベストアンサー
- Oracle
お礼
ありがとうございました。動作確認しました。 なぜそうなるかがいまいち理解出来ていないですが、これから考えてみたいと思います。