![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?8acaa2e)
以下のようなテーブル構造のデータベースですが
---
社員tb
社員ID
社員名
地区tb
地区ID
地区名
成績tb
成績ID
社員ID
地区ID
営業成績
---
「地区ごとの成績トップ社員の一覧」を出そうとして
SELECT
社員tb.社員ID,
社員tb.社員名,
地区tb.地区ID,
地区tb.地区名,
max(成績tb.営業成績)
FROM
社員tb,地区tb,成績tb
WHERE
社員tb.社員ID = 成績tb.社員ID
AND 地区tb.地区ID = 成績tb.地区ID
GROUP BY
地区ID
というSQL文を実行したら
なぜか社員名フィールドがすべて特定の社員しか表示されない
(Bが地区トップのはずなのにAと表示される等)状態です。
どなたか解決法をご教示下さい…
ちなみにバージョンは 5.0.33 です。
No.1ベストアンサー
- 回答日時:
表の列構成だけでなく、各表のデータ例、得たい結果例も示してください。
回答者側で作るのは、意外と大変なんです。>「地区ごとの成績トップ社員の一覧」を出そうとして
group byの使い方を間違っている(MySQLでは文法エラーにしていないが、標準SQLや他のRDBMSでは文法誤り)し、成績トップの社員を求めるSQLになっていません。
標準SQLや他のRDBMSでは、group by指定時、selectで指定できるのは、group byで指定した列とsumやmaxなどの関数だけです。MySQLではその制限を緩和してエラーとしない代わりに、group byで指定した列以外をselectで指定する場合は、一意になるようにしなければ、結果はどうなるか保証されていません。【誤り1】
例)
正しい→select c1,max(c2) from t1 group by c1
誤り→select c1,c3,max(c2) from t1 group by c1
標準SQLや他のRDBMSでは文法エラー。
MySQLでは、c1のグループ毎にc3の値が一意になるなら指定していい。一意にならないなら、結果は保証しない。
質問者さんが作ったSQLでは、MAX(営業成績)という記述をしていますが、誰が上げた成績かを求めるSQLになっていません。【誤り2】
求め方を、段階的に(1)~(3)で示します。
(3)が、「地区ごとの成績トップ社員の一覧」を求めるSQLになります。
(1)地区毎の営業成績の最大値を求める
select 地区ID,max(営業成績)
from 成績tb
group by 地区ID
;
(2)(1)+社員IDを求める
select 社員ID,地区ID,営業成績
from 成績tb
where (地区ID,営業成績) in(
select 地区ID,max(営業成績)
from 成績tb
group by 地区ID
)
;
(3)(2)+IDを名称に変換
select x.社員ID,社員名,x.地区ID,地区名,営業成績
from 成績tb as x,社員tb as y,地区tb as z
where (x.地区ID,営業成績) in(
select 地区ID,max(営業成績)
from 成績tb
group by 地区ID
)
and x.社員ID=y.社員ID and x.地区ID=z.地区ID
order by x.社員ID,x.地区ID
;
>回答者側で作るのは、意外と大変なんです。
思慮の足りない質問の仕方でした…
大変申し訳ないとともに、それでも親切にお教えいただいて
大変ありがたく思っております。
誤り1・誤り2の指摘もありがとうございます。
さらに、実際的かつ段階的に説明していただいたお陰で
SQLに関しての知識を深めることができました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) Accessの参照フィールドの列がずれてしまいます 1 2023/07/19 15:00
- MySQL PHP 画像のアップロード Qiita 2 2022/11/28 04:44
- Excel(エクセル) 指定した数字まで累計する方法や文字例の抽出について教えてください 4 2022/10/05 21:19
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- 宗教学 唱題が終わった直後です。はあ、はあ、はあ幸福感が止りません。 5 2022/05/06 16:57
- その他(IT・Webサービス) webで名刺作成したいと考えてます。IDとパスワードを入れると、自社の社員一覧が表示され、役職や所属 1 2023/08/05 23:50
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- Excel(エクセル) 至急です><Excelの関数を教えてください。 2 2022/03/22 17:56
- その他(自転車) Bリーグについて 0 2022/05/29 19:05
- 農林水産業・鉱業 農業委員及び農地利用最適化推進委員の候補者無しに苦慮 1 2022/09/02 22:28
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CREATE テーブルでの複数外部...
-
複数テーブル間の集計
-
基本情報技術者の試験について
-
Access終了時の最適化が失敗?
-
表の結合について
-
Oracleでの文字列連結サイズの上限
-
Excelでセルの書式設定を使用し...
-
SQL>UPDATEと同時にその件数を...
-
GROUP BYを使ったSELECT文の総...
-
SQL文で右から1文字だけ削除す...
-
SELECTで1件のみ取得するには?
-
フォームの移動でのイベント
-
Accessで別テーブルの値をフォ...
-
sqlのwhereで指定した条件の前...
-
固定値を含む結合と複数テーブ...
-
エクセルなんですけど・・・・
-
【MYSQL】asでリネームしてwher...
-
エクセル関数 文字(ハイフン...
-
ADO VBA 実行時エラー3021
-
Access:抽出して、色をつけたい。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access終了時の最適化が失敗?
-
CREATE テーブルでの複数外部...
-
沿線コード
-
10営業日前の日付を取得したい...
-
Order by句でバインド変数を使...
-
ヤマト急便のチェックデジット...
-
同一コード毎に最新の名称を取...
-
SQLに関して
-
【SQL】登録されているかを比較...
-
SELECT文で
-
オラクル 名称をコードに変換
-
一度のSQL発行で結果を得るには...
-
SQLの抽出条件の記述の仕方につ...
-
ACCESSで、コード基本のお勧め...
-
SQLにて縦を横へ展開
-
SQLの集約の方法
-
ストアドプロシージャーの引数...
-
SQLで<>を使用するとき、
-
基本情報技術者の試験について
-
SQL 特定のカラムが最大値のレ...
おすすめ情報