id | num | goal| sqd
1 | 10 | null| 中村俊輔
2 | 10 | 1 | 中村俊輔
3 | 10 | 2 | 中村俊輔
4 | 10 | 3 | 中村俊輔
5 | 9 | null| 松井大輔
6 | 7 | null| 遠藤保仁
7 | 7 | 1 | 遠藤保仁
8 | 7 | 2 | 遠藤保仁
9 | 22 | null| 阿部勇樹
10 | 22 | 1 | 阿部勇樹
背番号(num)ごとにgoal数の一番大きな値ひとつと、ノーゴール(Null値)の行を抜き出したいのですが、この場合のSQLの書き方をご教示ください。この例で言えば、
1 | 10 | null| 中村俊輔
4 | 10 | 3 | 中村俊輔
5 | 9 | null| 松井大輔
6 | 7 | null| 遠藤保仁
8 | 7 | 2 | 遠藤保仁
9 | 22 | null| 阿部勇樹
10 | 22 | 1 | 阿部勇樹
上記のような結果になるようなSQLになります。
以下の SQL 文ではいかがでしょうか。(SQLite 3.5.8 にて確認)
SELECT id, num, goal, sqd, (CASE WHEN goal IS NULL THEN 0 ELSE 1 END) AS temp FROM goals GROUP BY num, temp HAVING goal = MAX(goal) OR goal IS NULL ;
ただし、
・余計な列 (temp) が追加されてしまいますので、無視 or 邪魔でしたら削ってください。
・「null」は文字列の"null"でなくいわゆるnull値だと仮定しました。
※ temp なしで出来そうな気もするのですが思いつきませんでした。
SELECT * FROM ( SELECT id,num,sqd,max(goal) AS max_goal FROM goals WHERE goal IS NOT NULL GROUP BY id,num,sqd UNION SELECT id,num,sqd,goal AS max_goal FROM goals WHERE goal IS NULL ) AS temp ORDER BY id
試してないけどこんなとこ?
順序が指定できなくてもいいなら、サブクエリの中だけですみます。
すみません。FROM goalsのところの「goals」はなぜgoalsになっているのでしょうか?
※2回目です
JOIN つかってみました(Access 2003 で確認済み)
SELECT Min(テーブル1.id) AS min_id, テーブル1.num, テーブル1.goal, テーブル1.sqd FROM テーブル1 LEFT JOIN テーブル1 AS 作業用 ON テーブル1.num = 作業用.num GROUP BY テーブル1.id, テーブル1.num, テーブル1.goal, テーブル1.sqd HAVING テーブル1.goal is null or テーブル1.goal=Max(作業用.goal);
・「テーブル1」というのは、質問中の「以下のようなテーブルがあります」のテーブルの名前です。状況に合わせて読み替えてください。(さきほどは勝手に goals に決めてしまったので他の回答者さんも含めて混乱させてしまったようですみません。)
・「作業用」というのはこのSQLクエリで勝手に決めた名前ですのでそのようなテーブルを別途作成する必要はありません。もちろん、好きな名前に変更しても構いません。
・同じ背番号で、goal数の一番大きな値をとるレコードが複数ある場合には一番最初のレコード(idが最小のもの)だけ表示します。
・同じ背番号で、null値をとるレコードが複数ある場合は、そのまま全てのレコードを表示します。
おー。。すばらしい
うまくいきました!
ありがとうございました。
すみません。実はこのSQLはAccess2007が実行環境になっているので、case文が使えないのです…。