列を行に変える SQL (UNION)
出典: 令和3年度 秋期 応用情報技術者試験 午前 問29 (IPA)
“部門別売上” 表から,部門コードごと,期ごとの売上を得る 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 |
- ア 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 部門コード, 期
正解と解説を見る
正解: イ
- ア: INTERSECT は両方の結果に共通する行だけを返します。期の値が違うので共通の行はなく、結果は 0 行になります。
- イ: 第 1 期の結果と第 2 期の結果を UNION で縦につなげて並べ替えるので、問合せ結果と一致します。正しい答えです。
- ウ: CROSS JOIN は全ての組合せを横につなげるので、3 × 3 = 9 行で、列も 6 列になります。
- エ: INNER JOIN は部門コードが同じ行を横につなげるので、3 行で、列も 6 列になります。
ポイント
- 問合せ結果は、第 1 期の行 (3 行) と第 2 期の行 (3 行) を 縦に合わせた 6 行です。
- 2 つの SELECT の結果を縦につなげるのは UNION です。期の列は、'第 1 期' のような定数に AS で名前を付けて作っています。