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 クイズシリーズは、……たぶん続かないです。