web-dev-qa-db-ja.com

COUNT(*)とCOUNT(*)OVER()の違いは何ですか

次のコード例を見てください。

_SELECT MaritalStatus,
       COUNT(*) AS CountResult
       COUNT(*) OVER() AS CountOverResult
       FROM (schema).(table)
       GROUP BY Marital Status
_

COUNT(*) nullを無視してすべての行を返しますか?

COUNT(*) OVER()は何をしますか?

この質問は模擬試験で出されたので、クエリするデータがありませんでした。私は、Adventure Worksとこのサイト http://www.sqlishard.com/Exercise を使用して練習しています。

次のようなクエリを入力した場合

_SELECT ID, COUNT(*) AS 'COUNT(*)' , COUNT(*) OVER() AS 'COUNT(*) OVER()'
FROM Customers
GROUP BY ID
_

練習サイトに入ると、Count(*)列が1でいっぱいになり、Count(*) Over()列が行の総数でいっぱいになった3794行が返されます。私はこのパターンを理解できなかったので(すみません)、ここに来ました。

7
David Folksman

COUNT(*)nullを無視してすべての行を返しますか?

ここで「nullを無視する」という意味がわかりません。 NULLsに関係なく、行数を返します

_SELECT COUNT(*)       
FROM (VALUES (CAST(NULL AS INT)),
             (CAST(NULL AS INT))) V(C)
_

_2_を返します。

上記のクエリをCOUNT(C)に変更すると、_0_以外の式でCOUNTを使用する場合と同様に、_*_が返されます。その式の_NOT NULL_値のみがカウントされます。

質問のテーブルに次のソースデータがあるとします。

_+---------+---------------+
|  Name   | MaritalStatus |
+---------+---------------+
| Albert  | Single        |
| Bob     | Single        |
| Charles | Single        |
| David   | Single        |
| Edward  | Married       |
| Fred    | Married       |
| George  | NULL          |
+---------+---------------+
_

クエリ

_SELECT MaritalStatus,
       COUNT(*) AS CountResult
FROM   T
GROUP  BY MaritalStatus 
_

戻り値

_+---------------+-------------+
| MaritalStatus | CountResult |
+---------------+-------------+
| Single        |           4 |
| Married       |           2 |
| NULL          |           1 |
+---------------+-------------+
_

うまくいけば、その結果が元のデータとどのように関連しているかは明らかです。

COUNT(*) OVER()は何をしますか?

これを前のクエリのSELECTリストに追加すると、

_+---------------+-------------+-----------------+
| MaritalStatus | CountResult | CountOverResult |
+---------------+-------------+-----------------+
| Single        |           4 |               3 |
| Married       |           2 |               3 |
| NULL          |           1 |               3 |
+---------------+-------------+-----------------+
_

結果セットには3つの行があり、CountOverResultは3です。これは偶然ではありません。

これは、_GROUP BY_の後の結果セットを論理的に操作するためです。

COUNT(*) OVER ()はウィンドウ化された集計です。 _PARTITION BY_または_ORDER BY_句がない場合は、それが操作するウィンドウが結果セット全体であることを意味します。

質問のクエリの場合、CountOverResultの値は、ベーステーブルに存在する個別のMaritalStatus値の数と同じです。これは、グループ化された結果。

14
Martin Smith