SMITサービスマネージャ試験 午前Ⅱ
平成30年度秋期 ITサービスマネージャ 午前Ⅱ 問21
問題文と選択肢を読んで答えを考えてから、下の「正解と解説を見る」で確認しましょう。
問題

選択肢
- アSELECT 部門名 FROM 社員 GROUP BY 部門名 HAVING COUNT(*) >= 3 WHERE 役割名 = 'プログラマ'
- イSELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 GROUP BY 部門名 HAVING 役割名 = 'プログラマ'
- ウSELECT 部門名 FROM 社員 WHERE COUNT(*) >= 3 AND 役割名 = 'プログラマ' GROUP BY 部門名
- エSELECT 部門名 FROM 社員 WHERE 役割名 = 'プログラマ' GROUP BY 部門名 HAVING COUNT(*) >= 3
解き方のヒントを見る
集計と抽出の範囲を整理する
部門ごとの集計結果を扱う問題では、どの単位で情報をまとめ、まとめる前後の条件が何を対象にしているかを切り分けて考えると、処理の意図を比較しやすくなります。
この問題で問われていること
一つの焦点として、条件が個々の行に先に関係するのか、集計して得た部門単位の結果に関係するのかを、問題文の目的と照らして確認してください。
視点
集計と抽出を考えるときは、対象となるデータの粒度と、条件が評価される段階を分けて整理します。まず何を一つのまとまりとして比較するのかを確認し、その後に条件の対象が変わっていないかを見直すと、処理の意味を落ち着いて追えます。
確認ポイント
- 条件が評価される対象は、個々のデータか、まとまりごとの結果か。
- 集計単位は、求められている比較の単位と一致しているか。
- 条件を適用する前後で、対象となるデータの範囲がどう変わるか。
正解と解説を見る
正解
エ
解説
役割名がプログラマである行だけを先に抽出し、その後に部門名でグループ化して、各部門の人数をCOUNT(*)で集計する。最後にHAVING句で人数が3人以上のグループを選ぶため、正しいSQL文はエです。
理由
WHERE句は集約処理の前に社員行を絞り込むため、役割名がプログラマである社員だけを対象にできる。その後、部門名でグループ化し、HAVING COUNT(*) >= 3で部門ごとの人数条件を判定する。
比較
COUNT(*)によるグループ単位の条件はHAVING句に置き、役割名のような個々の行の条件はWHERE句に置く。また、WHERE、GROUP BY、HAVINGの構文上の順序も守る必要がある。
選択肢ア
これは不正解だよ。GROUP BYとHAVINGの後にWHEREを置いており、SQLの句の構文順序に反するため文自体が成立しません。役割名による絞り込みを集約後に行うという実行時の問題ではなく、まず構文エラーになる点が誤りです。
選択肢イ
これは不正解だよ。WHERE句でCOUNT(*)を使っており、集約関数によるグループ単位の条件を行単位の絞込み句で指定しています。また、HAVING句の役割名はGROUP BYの対象でも集約結果でもないため、この条件指定も適切ではありません。
選択肢ウ
これは不正解だよ。役割名をWHERE句で指定している点は条件の対象に合っていますが、COUNT(*) >= 3までWHERE句に置いています。COUNT(*)は部門ごとにグループ化した後の集約結果なので、WHERE句ではなくHAVING句で判定します。
選択肢エ(正解)
これは正解だよ。WHERE句で役割名がプログラマの社員だけを先に抽出し、GROUP BY 部門名で部門ごとにまとめています。その後、HAVING COUNT(*) >= 3で各部門の該当社員数が3人以上のグループを選択しています。
学習のポイント
WHERE句とHAVING句の対象、集約関数を使える位置、SQLの句の構文順序を整理する。
出典:独立行政法人 情報処理推進機構(IPA)平成30年度秋期 ITサービスマネージャ試験 午前Ⅱ 問21(公式資料:問題冊子(PDF) / 解答例)
関連する過去問一覧
IPA Advancedは非公式の学習サイトです。解説にはAIによる補助生成を含む場合があります。公式の問題冊子・解答例・採点講評を優先し、誤りは確認後に訂正します。運営・編集方針