人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: ArimaKei
●カテゴリ:ビジネス・経営 コンピュータ
✍キーワード:SQL ひとつ 中村俊輔 松井大輔 背番号
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● cicupo
●27ポイント

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

◎質問者からの返答

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


2 ● b-wind
●27ポイント
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になっているのでしょうか?


3 ● cicupo
●26ポイント

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

◎質問者からの返答

おー。。すばらしい

うまくいきました!

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ