平成31年春期試験午前問題 午前Ⅱ 問14

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

〔条件〕
  • 同一"会員番号"をもつ複数の行によって,一人の会員の属性を表す。
  • 新規に追加する行の行番号は,最後に追加された行の行番号に1を加えた値とする。
  • 同一"会員番号"で同一"項目名"の行が複数ある場合,より大きい行番号の項目値を採用する。
14_1.gif
14_2.gif

  • COUNT
  • DISTINCT
  • MAX
  • MIN
正解 問題へ
分野:テクノロジ系
中分類:データベース
小分類:データ操作
まずGROUP BY句を用いている場合は、グループ化対象列または集計関数しかSELECT文に指定できません。DISTINCTは集計関数ではないので誤りとわかります。次に、COUNTは行数を返す関数であり、〔結果表〕の会員名と最終購入年月日が文字列になっていることから誤りと判断できます。
残るMINとMAXですが、MINを採用すると一番内側のSELECT文で会員番号と項目名のグループから行番号を取得するときに、グループごとに最も小さい行番号が取得されてしまうことになり、「より大きい行番号の項目値を採用する」という条件に反するため誤りです。

したがってaには「MAX」が当てはまります。

MAXを指定した場合の動作は次のようになります。
SELECT MAX(行番号) FROM 会員項目
 GROUP BY 会員番号, 項目名
会員項目表を会員番号と項目名でグループ化し、MAX関数でそのグループごとに最も最も大きい行番号を取得します。これにより、当該会員に係るレコードの行番号(同一項目が複数ある場合はより大きい行番号だけ)のリストを得ることができます。この結果表を①とします。

SELECT 会員番号, 項目名, 項目値 FROM 会員項目
 WHERE 行番号 IN ①
会員項目表から、該当する行番号をもつレコードだけを選択します。この結果表をTとします。

SELECT 会員番号,
 MAX (CASE …) AS 会員名
 MAX (CASE …) AS 最終購入年月日
 FROM T
 GROUP BY 会員番号
 ORDER BY 会員番号
このSELECT文により、会員番号、会員名、最終購入年月日を抽出します。MAX関数を用いているのは、GROUP BY句を使用しているので集計関数しか指定できない、該当するレコードが存在しないときにNULLを表示したいからです。

この問題の出題歴


Pagetop