“部門別売上”表から,部門コードごと,期ごとの売上を得る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
正答2
解説
正解は2です。
この問題は、列として横に並んだ第1期・第2期の売上を、行として縦に並べ替えるSQL文を問うています。
第1期の行を取り出すSELECTと第2期の行を取り出すSELECTを作り、結果を縦に連結すればよいことになります。
【選択肢別解説】
1:× INTERSECTは、二つの問合せ結果に共通する行だけを返す演算です。
第1期の行は期が'第1期'、第2期の行は'第2期'なので共通する行がなく、結果は0行になります。
2:○ UNIONは、二つの問合せ結果を縦に連結し、重複を除いて返す演算です。
第1期の3行と第2期の3行を合わせた6行を部門コードと期で並べると、問合せ結果と一致します。
3:× CROSS JOINは、二つの表の行のすべての組合せを作る直積です。
3行×3行の9行ができ、SELECT句はAの列だけなので、第1期の各行が3回ずつ重複して出力されます。
第2期の行は出力されないので、問合せ結果とは一致しません。
4:× INNER JOINで部門コードを条件に結合すると、部門ごとに1行ずつの3行になります。
SELECT句はAの列だけなので第1期の3行しか出力されず、第2期の行が得られません。
【ポイント】
行を縦に足すのはUNION、列を横に足すのはJOINです。
UNIONは重複行を除き、重複も残したいときはUNION ALLを使います。