ホーム > データベーススペシャリスト試験 > 2019年

データベーススペシャリスト試験 2019年 午前214


ある電子商取引サイトでは, 会員の属性を柔軟に変更できるように, “会員項目”表で管理することにした。“会員項目”表に対し, 次の条件でSQL文を実行して結果を得る場合, SQL文のaに入れる字句はどれか。ここで, 実線の下線は主キーを, NULLは値がないことを表す。
〔条件〕  (1)同一“会員番号”をもつ複数の行によって, 一人の会員の属性を表す。  (2)新規に追加する行の行番号は, 最後に追加された行の行番号に1を加えた値とする。  (3)同一“会員番号”で同一“項目名”の行が複数ある場合, より大きい行番号の項目値を採用する。
問題画像
COUNT
DISTINCT
MAX(正解)
MIN

解説

問14 SQL の意図と集計関数の選択

1. テーブル構造と要件

条件内容
(1)1 人の会員に対し,同一 会員番号 で複数行を保持し属性を管理する。
(2)行番号 は登録順に連番で振られ,値が大きいほど新しい行。
(3)同じ 会員番号 × 項目名 が複数ある場合は 行番号が最大の行 を採用する。

2. サブクエリの狙い

SELECT 会員番号, 項目名, 項目値
FROM   会員項目
WHERE  行番号 IN (
        SELECT a(行番号)    -- ←★ココ (a) に入る集計関数
        FROM   会員項目
        GROUP  BY 会員番号, 項目名 )
  • 内側のサブクエリで
    • 会員番号項目名 ごとに 最新行番号 を 1 行返す
  • 外側でその行番号(=最新)だけを抽出

3. どの集計関数を使うべきか

関数返す値要件との適合
COUNT行数最新行を特定できない → ✕
DISTINCTキーワード(集計関数ではない)
MAX最大値“より大きい行番号の項目値を採用” に合致 → ◎
MIN最小値最古の行を取ってしまう → ✕

4. SELECT 句でも MAX を用いる理由

外側 SELECT で
MAX(CASE WHEN 項目名='会員名'         THEN 項目値 END) AS 会員名 ,
MAX(CASE WHEN 項目名='最終購入年月日' THEN 項目値 END) AS 最終購入年月日
  • サブクエリで行を 2 列に絞っても、行はまだ 会員番号 × 項目名 単位で残っている。
  • GROUP BY 会員番号 で 1 レコードにまとめる際、
    MAX を使えば NULL でない値(=その会員の最新値)を拾える。

結果

  • (a) に入れるべき集計関数は MAX
  • よって正解は

出力例(問題文と同じ)

会員番号会員名最終購入年月日
0111情報次郎2019-02-05
0112情報花子2019-02-01
0113情報次郎NULL
(行番号が最新のレコードのみ採用されていることを確認できる。)
← 前の問題へ次の問題へ →

©︎2025 情報処理技術者試験対策アプリ