本の Querying MS SQL Server 2012 (Training Kit) for Exam 70-461 ではGROUP BY
、論理処理におけるクエリのフェーズについて次のように述べています。
このクエリの最終結果には、各グループを表す 1 つの行があります (除外されていない場合)。したがって、現在のグループ化フェーズの後に発生するすべてのフェーズでの式は、多少制限されます。後続のフェーズで処理されるすべての式は、グループごとに 1 つの値を保証する必要があります。GROUP BY リストの要素 (国など) を参照する場合、既にそのような保証があるため、そのような参照は許可されます。ただし、GROUP BY リストの一部ではない要素 (empid など) を参照する場合は、MAX や SUM などの集計関数内に含まれている必要があります。これは、1 つのグループ内の要素で複数の値が可能であり、1 つのみが返されることを保証する唯一の方法は、値を集約することであるためです。
次に、作成者はHAVING
を使用するステップについて言及しますCOUNT(*) > 1
。私の質問は、GROUP BY
グループごとに1行の結果しかない場合、HAVING
その単一のグループ行を使用して、複数の行を持つグループを除外するフェーズはどうですか...それらの半分が残っているので、それは行われますか? ここで何かが足りないのですか?各グループに何らかの非表示の COUNT 列が関連付けられていますか?
クエリは次のとおりです。
SELECT country, YEAR(hiredate) AS yearhired, COUNT(*) AS numemployees
FROM HR.Employees
WHERE hiredate >= '20030101'
GROUP BY country, YEAR(hiredate)
HAVING COUNT(*) > 1
ORDER BY country , yearhired DESC;
啓蒙してください。