令和3年度 秋期 応用情報技術者試験 午前 問題 問29

“部門別売上”表から,部門コードごと,期ごとの売上を得るSQL文はどれか。

部門別売上
図の説明テキスト

部門別売上

部門コード 第1期売上 第2期売上
D01 1,000 4,000
D02 2,000 5,000
D03 3,000 8,000
〔問合せ結果〕
図の説明テキスト

〔問合せ結果〕

部門コード 期 売上
D01 第1期 1,000
D01 第2期 4,000
D02 第1期 2,000
D02 第2期 5,000
D03 第1期 3,000
D03 第2期 8,000
解答・解説

正解: イ. sql SELECT 部門コード,'第1期' AS 期,第1期売上 AS 売上 FROM 部門別売上 UNION (SELECT 部門コード,'第2期' AS 期,第2期売上 AS 売上 FROM 部門別売上) ORDER BY 部門コード,期

【部門別売上】表は、1つの部門につき第1期と第2期の売上が同じ行にまとまっている「横持ち」の構造です。一方、目的とする【問合せ結果】は、1つの部門につき第1期の行と第2期の行が分かれている「縦持ち」の構造になっています。

このように、列として並んでいるデータを複数の行に変換するには、それぞれの列を取り出す SELECT 文を別々に記述し、それらの結果を UNION(和集合)演算子で縦に結合する方法が用いられます。

正解の選択肢(イ)のSQL文を見てみましょう。

  1. 前半の SELECT 文:
    SELECT 部門コード,'第1期' AS 期,第1期売上 AS 売上 FROM 部門別売上
    これにより、部門コード、固定文字列 '第1期'、第1期売上の3つの列を持つ3行のデータが抽出されます。

  2. 後半の SELECT 文:
    SELECT 部門コード,'第2期' AS 期,第2期売上 AS 売上 FROM 部門別売上
    これにより、部門コード、固定文字列 '第2期'、第2期売上の3つの列を持つ3行のデータが抽出されます。

  3. これらを UNION で結合することで、合計6行のデータとなり、最後に ORDER BY 部門コード,期 で整列されることで、【問合せ結果】の表と完全に一致します。

各選択肢の解説

  • ア:INTERSECT は2つの SELECT 文の結果に共通して存在する行のみを抽出する演算子(積集合)です。前半は「期」が '第1期'、後半は '第2期' となるため、共通する行は1つも存在せず、結果は0行になってしまいます。
  • イ:正解です。
  • ウ:CROSS JOIN は2つの表のすべての組み合わせを作成する演算子(直積)です。「部門別売上」表(3行)同士を掛け合わせるため、3行 × 3行 = 9行のデータが生成されてしまい、誤りです。
  • エ:INNER JOIN は条件に一致する行同士を横に繋げる演算子(内部結合)です。A.部門コード = T.部門コード で結合すると、結果は3行のまま列数が増える(第1期のデータの横に第2期のデータが並ぶ)だけであり、「問合せ結果」のような縦持ちの6行にはなりません。

Spineチーム