応用情報技術者 2021年 秋期 午前2 問29
問題文
“部門別売上”表から、部門コードごと、期ごとの売上を得る SQL文はどれか。

選択肢
ア:
SELECT 部門コード、 '第1期' AS期、 第1期売上 AS 売上
FROM 部門別売上
INTERSECT
(SELECT 部門コード、 '第2期' AS 期、 第2期売上 AS 売上
FROM 部門別売上)
ORDER BY 部門コード、 期
イ:
SELECT 部門コード、 '第1期' AS期、 第1期売上 AS 売上
FROM 部門別売上
UNION
(SELECT 部門コード、 ' 第2期' AS期、第2期売上 AS 売上
FROM 部門別売上)
ORDER BY 部門コード、 期
(正解)ウ:
SELECT A.部門コード、 '第1期AS期、 A.第1期売上 AS 売上
FROM 部門別売上 A
CROSS JOIN
(SELECT B.部門コード、 '第2期 AS 期、 B.第2期売上 AS 売上
FROM 部門別売上 B) T
ORDER BY 部門コード、 期
エ:
SELECT A.部門コード、 '第1期’AS期、 A. 第1期売上 AS 売上
FROM 部門別売上 A
INNER JOIN
(SELECT B.部門コード、 '第2期'AS期、 B. 第2期売上 AS 売上
FROM 部門別売上 B) T ON A.部門コード = T.部門コード
ORDER BY 部門コード、 期
部門別売上表から期ごとの売上を得るSQL文【午前2 解説】
要点まとめ
- 結論:部門コードごとに第1期と第2期の売上を縦に並べるにはUNIONを使うのが正解です。
- 根拠:UNIONは複数のSELECT結果を縦方向に結合し、重複を排除しつつ統合できるため、期ごとの売上を1列にまとめられます。
- 差がつくポイント:INTERSECTやJOINは縦方向の結合には不向きで、特にINTERSECTは共通部分のみ抽出し結果が減るため誤りです。
正解の理由
選択肢イは、第1期売上と第2期売上をそれぞれSELECTし、UNIONで縦に結合しています。これにより「部門コード」「期」「売上」の3列構成で、期ごとの売上データが1行ずつ得られます。ORDER BYで部門コードと期の順に並べ替えも適切です。
よくある誤解
INTERSECTは複数のSELECTの共通部分を抽出するため、売上データを縦に並べる用途には使えません。JOINは横方向の結合であり、縦にデータを展開するには不適切です。
解法ステップ
- 第1期売上を「期」列に'第1期'としてSELECTする。
- 第2期売上を「期」列に'第2期'としてSELECTする。
- 2つのSELECT結果をUNIONで縦に結合する。
- 結果を部門コードと期でORDER BYして並べ替える。
選択肢別の誤答解説
- ア: INTERSECTは共通部分のみ抽出し、両期の売上が同じ部門コードで一致する行だけになるため不適切。
- イ: 正解。UNIONで縦に結合し、期ごとの売上を正しく取得できる。
- ウ: CROSS JOINは全組み合わせを作るため、売上が不正確に増える。
- エ: INNER JOINは横方向の結合で、期ごとの売上を縦に展開できず、結果が重複し誤り。
補足コラム
SQLで複数列を縦に展開する操作は「アンピボット(unpivot)」と呼ばれます。標準SQLではUNIONを使う方法が一般的ですが、DBMSによってはUNPIVOT句が用意されている場合もあります。売上のような複数期のデータを分析する際に重要なテクニックです。
FAQ
Q: UNIONとUNION ALLの違いは何ですか?
A: UNIONは重複行を排除しますが、UNION ALLは重複も含めてすべて結合します。今回の問題では重複排除が必要なためUNIONが適切です。
A: UNIONは重複行を排除しますが、UNION ALLは重複も含めてすべて結合します。今回の問題では重複排除が必要なためUNIONが適切です。
Q: INTERSECTはどんな時に使いますか?
A: INTERSECTは複数のSELECT結果の共通部分を抽出したい場合に使います。今回のような縦展開には不向きです。
A: INTERSECTは複数のSELECT結果の共通部分を抽出したい場合に使います。今回のような縦展開には不向きです。
関連キーワード: SQL, UNION, INTERSECT, JOIN, アンピボット、売上集計、データ変換

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

