以下のようなテーブルがあります


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になります。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2008/06/03 00:05:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:cicupo No.1

回答回数13ベストアンサー獲得回数3

ポイント27pt

以下の 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 なしで出来そうな気もするのですが思いつきませんでした。

id:ArimaKei

すみません。実はこのSQLはAccess2007が実行環境になっているので、case文が使えないのです…。

2008/05/27 09:27:05
id:b-wind No.2

回答回数3344ベストアンサー獲得回数440

ポイント27pt
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

試してないけどこんなとこ?

順序が指定できなくてもいいなら、サブクエリの中だけですみます。

id:ArimaKei

すみません。FROM goalsのところの「goals」はなぜgoalsになっているのでしょうか?

2008/05/27 11:18:38
id:cicupo No.3

回答回数13ベストアンサー獲得回数3

ポイント26pt

※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値をとるレコードが複数ある場合は、そのまま全てのレコードを表示します。

id:ArimaKei

おー。。すばらしい

うまくいきました!

ありがとうございました。

2008/05/27 13:44:17

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません