平成29年度 春期 午前Ⅱ 問8
データ操作
CASEに関する問題
“社員”表から,部署コードごとの主任の人数と一般社員の人数を求めるSQL文とするために,aに入る字句はどれか。ここで,実線の下線は主キーを表す。
社員(社員コード,部署コード,社員名,役職)
〔SQL文〕
SELECT 部署コード, COUNT(CASE WHEN 役職 = '主任' [ a ] END) AS 主任の人数, COUNT(CASE WHEN 役職 = '一般社員' [ a ] END) AS 一般社員の人数 FROM 社員 GROUP BY 部署コード
〔結果の例〕
| 部署コード | 主任の人数 | 一般社員の人数 |
|---|---|---|
| AA01 | 2 | 5 |
| AA02 | 1 | 3 |
| BB01 | 0 | 1 |
- アTHEN 1 ELSE -1
- イTHEN 1 ELSE 0
- ウTHEN 1 ELSE NULL
- エTHEN NULL ELSE 1
答えと解説を見る
✓ これが正解ウTHEN 1 ELSE NULL
解説
COUNTはNULLを数えないので、該当しない行はNULLにします。
見分ける軸は、COUNT(式)がどの値を数えるかです。COUNTに列や式を渡すと、値がNULLでない行だけを数えます。そこで、CASE式で役職が主任の行には1、それ以外の行にはNULLを返すようにすれば、COUNTは主任の行だけを数えます。一般社員の人数も同じ仕組みです。返す値が1か0かは関係がなく、NULLでないかどうかだけが効きます。部署コードでGROUP BYしているので、部署ごとに主任の人数と一般社員の人数が並び、結果の例のように主任が0人の部署も0と出ます。COUNTは値の大小ではなくNULLでないかを見る、と覚えておくと、ELSEに入れる値で迷いません。
ほかの選択肢はなぜ違うのか
- アTHEN 1 ELSE -1:ELSEで返す-1もNULLではない値なので、COUNTはその行も数えます。結果として、役職に関係なく部署の全員の人数が主任の人数の欄にも一般社員の人数の欄にも出てしまいます。
- イTHEN 1 ELSE 0:0を返しても、COUNTにとってはNULLでない値なので1件として数えられます。SUMで合計するなら0は効きますが、COUNTでは部署の全行が数えられ、役職ごとの人数になりません。
- エTHEN NULL ELSE 1:条件に合う行でNULL、合わない行で1を返すので、数えられるのは条件に合わない行です。主任の人数の欄に主任以外の人数が出るという、向きが逆の結果になります。
出典:平成29年度 春期 データベーススペシャリスト試験 午前Ⅱ 問8
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)