令和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文を見てみましょう。
前半の
SELECT文:SELECT 部門コード,'第1期' AS 期,第1期売上 AS 売上 FROM 部門別売上
これにより、部門コード、固定文字列 '第1期'、第1期売上の3つの列を持つ3行のデータが抽出されます。後半の
SELECT文:SELECT 部門コード,'第2期' AS 期,第2期売上 AS 売上 FROM 部門別売上
これにより、部門コード、固定文字列 '第2期'、第2期売上の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行にはなりません。