お世話になります。
以下のようなデータが収められた、テーブル `test1` から
各教科(subject) の最高得点(score)とその名前(name)を取得したいのですが、
name | subject | score
-----+---------+-------
鈴木 | 国語 | 80
山本 | 国語 | 50
佐藤 | 国語 | 90
鈴木 | 英語 | 80
佐藤 | 英語 | 60
山本 | 英語 | 60
鈴木 | 数学 | 50
佐藤 | 数学 | 70
山本 | 数学 | 90
↓以下の結果取得したい
name | subject | score
-----+---------+-------
佐藤 | 国語 | 90
鈴木 | 英語 | 80
山本 | 数学 | 90
SELECT `name`,`subject`,MAX(score) AS score FROM `test1` GROUP BY `subject`;
のクエリだと以下の結果で期待する結果が取得できません。
name | subject | score
-----+---------+-------
鈴木 | 国語 | 90
鈴木 | 数学 | 90
鈴木 | 英語 | 80
どのようにすればいいのでしょうか?
教えていただければ助かります。よろしくお願いします。
No.1ベストアンサー
- 回答日時:
まず考え方としては
・各教科ごとの最高点を取得する
・教科と最高点を条件に名前を取得する
とすれば良いのではないかと。
当方SQL Server使いなので記法が少々異なるかも知れませんが・・・
SELECT T.name, T.subject, T.score
FROM test1 as T
INNER JOIN
(SELECT subject, MAX(score) FROM test1 GROUP BY subject)
as T1 ON T.subject=T1.subject AND T.score=T1.score
テーブルT1として教科ごとの最高点を取得、その後テーブルTから
合致する名前を取得します。
ありがとうございます。
期待通りの結果を得ることができました。
ローカルのMySQL5.0の環境では、エラーとなるので
MAX(score) → MAX(score) AS score
とすることで動作しました。
SELECT T.name, T.subject, T.score
FROM test1 as T
INNER JOIN
(SELECT subject, MAX(score) AS score FROM test1 GROUP BY subject)
as T1 ON T.subject=T1.subject AND T.score=T1.score
No.3
- 回答日時:
別解です。
select a.*
from test1 a inner join
( select subject,max(score) score
from test1
group by subject ) b
on a.subject=b.subject and a.score=b.score;
select a.*
from test1 a
where not exists
( select 1 from test1 b
where a.subject = b.subject
and a.score < b.score );
ありがとうございます
期待通りの結果を取得できました。
別解の方法は、なにか他の結果を取得するときにも使えそうですね。
勉強になりました。
No.2
- 回答日時:
RDBMSは、ここのカテゴリ通りMySQLですか?
バージョンは?
MySQL 4.0以前・・・一部のジョイン、union、一時表などは実装済
MySQL 4.1・・・ジョインの拡張、サブクエリ、unicodeなどの実装。一部の仕様変更。
MySQL 5.0・・・ビュー、ストアドプロシジャ、トリガなどの実装。一部の仕様変更。
MySQLであれば、すぐに思いつくだけでも、上記のような大きな機能追加や仕様変更があります。
>のクエリだと以下の結果で期待する結果が取得できません。
テストデータが良かったということですね。
MySQL 4.1以降で実行可能なSQL例を示します。
select
*
from test1 as x
where score=(select
max(score)
from test1
where subject=x.subject)
ありがとうございます。
期待通りの結果が得られました。
質問する文章をまとめるので、バージョンを書くのを忘れてました。
テスト環境は、MySQL5.0でした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- 大学受験 高校3年生です。大学入試についてです。 受験科目は英語100、国語100、面接50の計250点です。 3 2022/08/11 17:31
- 大学受験 数学が苦手で社会が得意な場合は一橋よりも東大の方が受かりやすい、ということはあり得ますか? 3 2022/04/16 16:46
- MySQL 三科目合計点のクラス別平均点求めるクエリ式を教えてください 1 2023/07/04 09:44
- 高校受験 こんにちは。今年新中3の女子です。私は現在ノー勉&授業ほぼ聞いてなくて5教科が111点でした。 国語 3 2022/03/25 13:36
- 高校受験 英語科に行くのはアリかナシか 5 2022/11/01 23:41
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- 中学校 理科だけが極端に苦手 5 2022/09/10 14:18
- MySQL 下記の問合せを行うクエリを、PhpMyAdminで作成して実行せよ。 第二回模試の3科目の各得点と合 1 2023/04/25 18:02
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
集計でテストの各教科の最高得...
-
【SQL】他テーブルに含まれる値...
-
フラグをたてるってどういうこ...
-
あってますか?SQL
-
SELECT INTOで一度に複数の変数...
-
truncate tableを使って複数の...
-
sqlに記述できない文字
-
エラーを起こす方法
-
テーブル名が可変の場合のクエ...
-
既存データをINSERT文にして出...
-
PostgreSQLのtimestamp型で時間...
-
テーブル定義書(Oracle) 【IX】...
-
timestampのデータはどのように...
-
ACCESS クエリーでソートの不具合
-
UPDATEで既存のレコードに文字...
-
SQLで、Join句で結合したテ...
-
ExcelのVLOOKUP関数の動作をMyS...
-
SELECTした結果に行番号を求めたい
-
Accessで今日から5日後
-
SQL*LOADER実行時のロードデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLで数字の値のもののみを取...
-
集計でテストの各教科の最高得...
-
固定長のデータをmysqlで取り込...
-
次の時間帯の勝率の合計を求め...
-
通し番号が一番若いレコードの削除
-
エラーをいくらチェックしてもD...
-
文字列を追加してUPDATEしたい
-
ポスグレで
-
delete構文のつなげなんですが...
-
【SQL】他テーブルに含まれる値...
-
SELECT INTOで一度に複数の変数...
-
フラグをたてるってどういうこ...
-
sqlに記述できない文字
-
Accessで今日から5日後
-
UPDATEで既存のレコードに文字...
-
truncate tableを使って複数の...
-
timestampのデータはどのように...
-
オラクルのUPDATEで複数テーブル
-
既存データをINSERT文にして出...
-
PostgreSQLのtimestamp型で時間...
おすすめ情報