ある電子商取引サイトでは、会員の属性を柔軟に変更できるように、“会員項目”表で管理することにした。“会員項目”表に対し、次の条件でSQL文を実行して結果を得る場合、SQL文のaに入れる字句はどれか。ここで、実線の下線は主キーを、NULLは値がないことを表す。 〔条件〕 (1) 同一“会員番号”をもつ複数の行によって、一人の会員の属性を表す。 (2) 新規に追加する行の行番号は、最後に追加された行の行番号に1を加えた値とする。 (3) 同一“会員番号”で同一“項目名”の行が複数ある場合、より大きい行番号の項目値を採用する。 〔会員項目〕 行番号1, 会員番号0111, 項目名=会員名, 項目値=情報太郎 行番号2, 会員番号0111, 項目名=最終購入年月日, 項目値=2019-02-05 行番号3, 会員番号0112, 項目名=会員名, 項目値=情報花子 行番号4, 会員番号0112, 項目名=最終購入年月日, 項目値=2019-01-30 行番号5, 会員番号0112, 項目名=最終購入年月日, 項目値=2019-02-01 行番号6, 会員番号0113, 項目名=会員名, 項目値=情報次郎 〔結果〕 会員番号0111, 会員名=情報太郎, 最終購入年月日=2019-02-05 会員番号0112, 会員名=情報花子, 最終購入年月日=2019-02-01 会員番号0113, 会員名=情報次郎, 最終購入年月日=NULL 〔SQL文〕 SELECT 会員番号, [ a ](CASE WHEN 項目名='会員名' THEN 項目値 END) AS 会員名, [ a ](CASE WHEN 項目名='最終購入年月日' THEN 項目値 END) AS 最終購入年月日 FROM ( SELECT 会員番号, 項目名, 項目値 FROM 会員項目 WHERE 行番号 IN ( SELECT [ a ](行番号) FROM 会員項目 GROUP BY 会員番号, 項目名 ) ) T GROUP BY 会員番号 ORDER BY 会員番号

最新行の採用と横持ち集約の両方をMAXで実現する

データベーススペシャリスト試験2019年度 春期 午前II14/SQL / 関数

会員項目:
行番号会員番号項目名項目値
10111会員名情報太郎
20111最終購入年月日2019-02-05
30112会員名情報花子
40112最終購入年月日2019-01-30
50112最終購入年月日2019-02-01
60113会員名情報次郎
結果:
会員番号会員名最終購入年月日
0111情報太郎2019-02-05
0112情報花子2019-02-01
0113情報次郎NULL

選択肢

正解と解説

正解: MAX

同じ会員番号・項目名の中で最も大きい行番号の値を採用するので、内側の副問合せではグループごとの行番号の最大値を求める必要がある。外側では項目名ごとに1行しかない値を1行にまとめるため、集約関数で取り出す。いずれもMAXを入れれば、該当しない場合の値はNULLのまま残る。

選択肢ごとの解説

出典:平成31年度 春期 データベーススペシャリスト試験 午前II 問14(IPA)

同じ分野の他の問題

最終更新:2026-08-25/解説・選択肢ごとの解説は資格暗記が独自に作成しています。問題文と選択肢の出典は上記のとおりです。