it-swarm.com.de

Was ist der Unterschied zwischen COUNT (*) und COUNT (*) OVER ()

Nehmen Sie das folgende Codebeispiel:

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

COUNT(*) Gibt alle Zeilen zurück, die Nullen ignorieren, oder?

Was macht COUNT(*) OVER()?

Diese Frage wurde in einer Übungsprüfung gestellt, sodass ich nicht die Daten zum Abfragen hatte. Ich habe Adventure Works und diese Site http://www.sqlishard.com/Exercise zum Üben verwendet.

Wenn ich eine Abfrage wie eingebe

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

auf der Übungsseite werden 3794 Zeilen zurückgegeben, wobei die Spalte Count(*) voll mit Einsen und die Spalte Count(*) Over() voll mit der Gesamtzahl der Zeilen ist. Ich habe dieses Muster nicht verstanden (sorry), also bin ich hierher gekommen.

7
David Folksman

COUNT (*) Gibt alle Zeilen zurück, die Nullen ignorieren, oder?

Ich bin mir nicht sicher, was Sie hier mit "Nullen ignorieren" meinen. Es gibt die Anzahl der Zeilen unabhängig von NULLs zurück

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

Gibt 2 Zurück.

Wenn Sie die obige Abfrage in COUNT(C) ändern, wird 0 Zurückgegeben, wenn Sie COUNT mit einem anderen Ausdruck als * Verwenden, nur NOT NULL Werte davon Ausdruck werden gezählt.

Angenommen, die Tabelle in Ihrer Frage enthält die folgenden Quelldaten

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

Die Abfrage

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

Kehrt zurück

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

Hoffentlich ist es offensichtlich, wie sich dieses Ergebnis auf die Originaldaten bezieht.

Was macht COUNT(*) OVER()?

Wenn Sie dies zur Liste SELECT für die vorherige Abfrage hinzufügen, wird dies erzeugt

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

Beachten Sie, dass die Ergebnismenge 3 Zeilen enthält und CountOverResult 3 ist. Dies ist kein Zufall.

Der Grund dafür ist, dass die Ergebnismenge nach GROUP BY Logisch verarbeitet wird.

COUNT(*) OVER () ist ein Fensteraggregat. Das Fehlen einer PARTITION BY - oder ORDER BY - Klausel bedeutet, dass das Fenster, in dem es arbeitet, die gesamte Ergebnismenge ist.

Bei der Abfrage in Ihrer Frage entspricht der Wert von CountOverResult der Anzahl der unterschiedlichen MaritalStatus -Werte, die in der Basistabelle vorhanden sind, da für jede dieser Werte in der Tabelle eine Zeile vorhanden ist gruppiertes Ergebnis.

14
Martin Smith