令和3年度秋期 応用情報技術者試験 午前 問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 部門コード, 期
解答・解説を見る
正解:イ
AI解説
“部門別売上”表は部門ごとに第1期売上・第2期売上を列として持つ横持ちのデータである。これを部門コード・期・売上の縦持ち形式に変換するには、第1期分の行と第2期分の行をそれぞれSELECTしUNION(和集合、重複除去)で結合すればよい。 ア: INTERSECT(共通集合)は両方のSELECT結果に共通する行だけを抽出する演算であり、第1期分と第2期分の行を両方とも残して縦持ちにする目的には合わない。 イ: 第1期分の行を返すSELECT文と第2期分の行を返すSELECT文をUNIONで結合すれば、部門コードごと・期ごとの売上を1行ずつ持つ縦持ちの結果が得られるため、これが正解である。 ウ: CROSS JOIN(直積)は両方の結果セットの行を総当たりで掛け合わせてしまうため、単純に行を積み上げたい(縦持ちにしたい)目的には適さず、行数が意図せず増えてしまう。 エ: INNER JOIN(内部結合)は部門コードが一致する行同士を横に連結してしまうため、第1期・第2期を別々の行として並べる縦持ち変換の目的には合わない。 💡 『横持ち(列で持つ)データを縦持ち(行で持つ)データに変換したい』ときはUNION(ALL)で複数のSELECT結果を積み上げる、というパターンを覚えておくと応用が利く。
※Web掲載用に表記を一部変更しています。図表はIPA公式問題冊子から引用しています。著作権はIPAに帰属します。