SQL クイズ: GROUP BY と COUNT(*) -- 解答編
結果は予想通りだったでしょうか、それとも意外でしたか? 問題編では、以下のテーブルに対して処理を実行しました。
SELECT * FROM Employee /* EmployeeID EmployeeName CountryID ----------- ------------- ---------- E001 山田 C001 E002 鈴木 C004 E003 中村 C001 E004 山本 C001 */
まずは、以下に解答を示します。
-- 問 1 DECLARE @ret1 int SET @ret1 = 999 SELECT @ret1 = COUNT(*) FROM Employee SELECT @ret1 -- 結果: 4
-- 問 2 DECLARE @ret2 int SET @ret2 = 999 SELECT @ret2 = COUNT(*) FROM Employee WHERE EmployeeID = N'E999' SELECT @ret2 -- 結果: 0
-- 問 3 DECLARE @ret3 int SET @ret3 = 999 SELECT @ret3 = COUNT(*) FROM Employee WHERE EmployeeID = N'E999' GROUP BY EmployeeID SELECT @ret3 -- 結果: 999
問 3 の結果に驚いた方が多いのではないでしょうか。なぜ変数に結果が代入されず、元の値 999 のままになるのか、変数に代入しない 2 つのバージョン (GROUP BY ありとなし) で確認してみましょう。
SELECT COUNT(*) FROM Employee WHERE EmployeeID = N'E999' -- 結果: 0
SELECT COUNT(*) FROM Employee WHERE EmployeeID = N'E999' GROUP BY EmployeeID -- 結果: (何も表示されない)
わかりましたか? うっかり GROUP BY を入れてしまうと、こういうことになります。もし、取得したい件数の意味が GROUP BY の結果の行数であるなら、 GROUP BY の結果で得られるテーブルに対して副問い合わせをする必要があるかもしれません。
この SQL クイズシリーズは、……たぶん続かないです。