合計給与が 600 以上の部署だけを出したい。正しいのは?
SELECT dept, SUM(salary) AS total FROM empWHERE SUM(salary) >= 600GROUP BY dept ORDER BY dept;正答
- SELECT dept, SUM(salary) AS total FROM emp HAVING SUM(salary) >= 600 GROUP BY dept ORDER BY dept;
- SELECT dept, SUM(salary) AS total FROM emp WHERE salary >= 600 GROUP BY dept ORDER BY dept;
- SELECT dept, SUM(salary) AS total FROM emp GROUP BY dept HAVING SUM(salary) >= 600 ORDER BY dept;
- SELECT dept, SUM(salary) AS total FROM emp GROUP BY dept WHERE SUM(salary) >= 600 ORDER BY dept;
解説
WHERE はグループ化の前に 1 行ずつ評価されるので、SUM のような集計関数は使えず、SQLite は集計関数の誤用としてエラーを返す。集計後の値で絞るには GROUP BY の直後に HAVING を書く。HAVING を GROUP BY より前に置く形は構文エラーになる。WHERE salary >= 600 は「1 人の給与が 600 以上」の意味になり、合計の条件とは別物で、この表では 0 件になる。
参考: www.sqlite.org
この問題を含む SQL のテストを制限時間つきで解く
SQLクイズへ