2

本の 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;

啓蒙してください。

4

1 に答える 1

0

作成者がグループごとに 1 つの行GROUP BYを参照する場合、結果セットを参照しています。グループごとの行を参照するときHAVINGは、入力を参照しています。

この単純なデータセットを想像してください

Col1    Col2    Value
----------------------
  a       a       1
  a       b       1
  a       b       1
  a       b       2
  a       c       1
  a       c       5

ご覧のとおり、(Col1, Col2) には 3 つの異なるタプル (a, a)、(a, b)、(a, c) があるため、Col1、Col2 で GROUP BY すると、3 つの行が得られます。結果 (グループごとに 1 つ)。

SELECT  Col1, Col2
FROM    T
GROUP BY Col1, Col2;

与える

Col1    Col2    
-------------
  a       a   
  a       b   
  a       c  

これは、著者が「グループごとに 1 行」と言うときに参照しているものです。

ただし、もう一度展開すると、タプル (a, b) を含む 2 つの行と (a, c) を表す 2 つの行があることがわかります。したがって、それぞれに 2 つの入力行があります。これはCOUNT(*)が参照しているものであり、数値ではありません。結果セットの行数。

集計関数 (having または select のいずれか) は、それぞれの部分 (HAVING、SELECT) ではなく、GROUP BYと同時に計算されます。これらは同じ操作です。これは、select または having で使用される前に、グループ内の行数の知識を維持する方法です。

Stackoverflow には、さらに読むために集約が舞台裏でどのように機能するかを説明する非常に良い答えがあるので、ここでは繰り返しません。

于 2013-11-08T13:07:52.777 に答える