次のコード例を見てください。
_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行が返されます。私はこのパターンを理解できなかったので(すみません)、ここに来ました。
COUNT(*)nullを無視してすべての行を返しますか?
ここで「nullを無視する」という意味がわかりません。 NULL
sに関係なく、行数を返します
_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
値の数と同じです。これは、グループ化された結果。