ホーム > データベーススペシャリスト試験 > 2019年
データベーススペシャリスト試験 2019年 午前2 問14
ある電子商取引サイトでは, 会員の属性を柔軟に変更できるように, “会員項目”表で管理することにした。“会員項目”表に対し, 次の条件でSQL文を実行して結果を得る場合, SQL文のaに入れる字句はどれか。ここで, 実線の下線は主キーを, NULLは値がないことを表す。
〔条件〕
(1)同一“会員番号”をもつ複数の行によって, 一人の会員の属性を表す。
(2)新規に追加する行の行番号は, 最後に追加された行の行番号に1を加えた値とする。
(3)同一“会員番号”で同一“項目名”の行が複数ある場合, より大きい行番号の項目値を採用する。

ア:COUNT
イ:DISTINCT
ウ:MAX(正解)
エ:MIN
解説
問14 SQL の意図と集計関数の選択
1. テーブル構造と要件
2. サブクエリの狙い
SELECT 会員番号, 項目名, 項目値
FROM 会員項目
WHERE 行番号 IN (
SELECT a(行番号) -- ←★ココ (a) に入る集計関数
FROM 会員項目
GROUP BY 会員番号, 項目名 )
- 内側のサブクエリで
- 会員番号・項目名 ごとに 最新行番号 を 1 行返す
- 外側でその行番号(=最新)だけを抽出
3. どの集計関数を使うべきか
4. SELECT 句でも MAX を用いる理由
外側 SELECT で
MAX(CASE WHEN 項目名='会員名' THEN 項目値 END) AS 会員名 ,
MAX(CASE WHEN 項目名='最終購入年月日' THEN 項目値 END) AS 最終購入年月日
- サブクエリで行を 2 列に絞っても、行はまだ 会員番号 × 項目名 単位で残っている。
GROUP BY 会員番号
で 1 レコードにまとめる際、
MAX を使えば NULL でない値(=その会員の最新値)を拾える。
結果
- (a) に入れるべき集計関数は MAX
- よって正解は ウ。
出力例(問題文と同じ)
(行番号が最新のレコードのみ採用されていることを確認できる。)