行番号の最大値取得による最新データ抽出

正解の理由 SQL文の構造と処理の意図を分析します。 内部サブクエリ: `WHERE 行番号 IN ( SELECT a (行番号) FROM 会員項目 GROUP BY 会員番号, 項目名 )` では、同一会員・同一項目名の中で「最も新しく追加された行(条件(3)の『より大きい行番号』)」のみを抽出する必要があります。行番号は追加順に増加するため、最大の行番号を取得する集約関数 `MAX(行番号)` が適切です。 外部クエリ: `GROUP BY 会員番号` で1会員につき1行に集約し、縦持ちの行(項目名・項目値)を横持ちの列(会員名、最終購入年月日)にピボット展開しています。`CASE WHEN 項目名 = '会員名' THEN 項目値 END` は該当行以外で NULL となるため、グループ内の非NULL値を取り出す集約関数として `MAX` を適用します(NULL値は無視され、文字列値が得られます)。 したがって、すべての空欄 `a` に共通して入る字句は `MAX` であり、ウが正解です。 各選択肢の解説 COUNT は行数を数える関数であり、行番号の値そのものを取得することはできません。 DISTINCT は重複行を排除する構文要素であり、`SELECT DISTINCT(行番号)` のようにグループごとの最大値を返す関数としては機能しません。 正しい字句です。最新の行番号を取得し、ピボット展開した値を取得するために MAX を用います。 MIN を指定すると最も小さい行番号(最も古いデータ)が採用され、条件(3)に反します。

ある電子商取引サイトでは,会員の属性を柔軟に変更できるように,“会員項目” 表で管理することにした。“会員項目” 表に対し,次の条件で SQL 文を実行して結果を得る場合,SQL 文の  a  に入れる字句はどれか。ここで,実線の下線は主キーを,NULL は値がないことを表す。

〔条件〕

  1. (1)

    同一 “会員番号” をもつ複数の行によって,1 人の会員の属性を表す。

  2. (2)

    新規に追加する行の行番号は,最後に追加された行の行番号に 1 を加えた値とする。

  3. (3)

    同一 “会員番号” で同一 “項目名” の行が複数ある場合,より大きい行番号の項目値を採用する。

“会員項目” 表

行番号

会員番号

項目名

項目値

1

0111

会員名

情報太郎

2

0111

最終購入年月日

2021-02-05

3

0112

会員名

情報花子

4

0112

最終購入年月日

2021-01-30

5

0112

最終購入年月日

2021-02-01

6

0113

会員名

情報次郎

〔結果〕

会員番号

会員名

最終購入年月日

0111

情報太郎

2021-02-05

0112

情報花子

2021-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 会員番号

出典2021r03a_db_am2_問10
ア
COUNT
イ
DISTINCT
ウ
MAX
エ
MIN