こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

サブクエリを使用せずにLEFT JOIN + GROUP BY + ORDER BYでデータの取得

課題テーブル:

1 課題1 Aさん
2 課題1 Bさん
3 課題1 Cさん
4 課題1 Dさん
5 課題1 Eさん
6 課題2 Bさん
7 課題2 Cさん

成績テーブル:

Aさん 算数 1
Aさん 国語 2
Bさん 算数 3
Cさん 算数 2
Dさん 国語 1

目的:
課題1を算数の成績順に取得したい。


普通にLEFT JOINすると以下のようになる。

1 課題1 Aさん 算数 1
1 課題1 Aさん 国語 2
2 課題1 Bさん 算数 3
3 課題1 Cさん 算数 2
4 課題1 Dさん 国語 1
5 課題1 Eさん NULL NULL

ここから名前を1つにまとめて、成績順に。

1 課題1 Aさん 算数 1
3 課題1 Cさん 算数 2
2 課題1 Bさん 算数 3
4 課題1 Dさん NULL NULL
5 課題1 Eさん NULL NULL

このようにしたいのですが、名前でGROUP BYすると科目と成績の整合性がとれなくなってしまい、正しく順位づけできません。

ORDER BY CASE
 WHEN 成績.科目 = '算数' THEN '0'
 WHEN 成績.科目 IS NULL THEN '2'
 ELSE '1'
END, 成績.科目, 成績.成績


サブクエリを使わずに実行する方法は、何かないものでしょうか。

投稿日時 - 2008-07-03 14:33:03

QNo.4148239

困ってます

質問者が選んだベストアンサー

LEFT JOINするときに条件で科目=算数をいれておいて、
WHEREで課題1をチョイスすればGROUP BY するまでもなく人は
ユニークになると思いますが・・・

こんなかんじ

SELECT *
FROM 課題
LEFT JOIN 成績 ON 課題.人=成績.人
AND 科目='算数'
WHERE 課題='課題1'
ORDER BY COALESCE(順位,999)

投稿日時 - 2008-07-03 14:53:38

お礼

なるほど!!
COALESCEを使えばうまく動きますね!

どうもありがとうございました。
本当に助かりました!

投稿日時 - 2008-07-03 16:29:51

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問