Hallo, wo brauchen Sie diese Art des Zählens von Datenbankcode in welcher Sprachdatenbank sprechen wir
? Mit
2
Ich bin überrascht, dass keine einzige Antwort eine einfache Vereinigung von Select Count (*) enthält ...
Lieven Keersmaekers
1
@Lieven: Warum um alles in der Welt würdest du unionhier ein verwenden? Montecristos Antwort ist bei weitem die beste Lösung.
Eric
1
Weil OP es mit einer einzigen Abfrage will. Montecristos Antwort ist in der Tat bei weitem die beste Lösung ... er muss nur die Gewerkschaft hinzufügen :)
Lieven Keersmaekers
1
Und das bekomme ich, wenn ich den Titel lese. Wird bearbeitet.
Eric
Antworten:
231
Dies funktioniert für Oracle und SQL Server (möglicherweise können Sie es auf einem anderen RDBMS zum Laufen bringen):
select sum(casewhen a isnullthen1else0end) count_nulls
, count(a) count_not_nulls
from us;
Verwenden Sie die Unterscheidung zwischen count(*)und count(a)funktioniert auch gut mitgroup by
Shannon
1
@shannon Ich stimme zu, COUNT(a)ist ein nützlicher Kommentar zum Hinzufügen, aber dies wirft abhängig von Ihrem Stapel eine Warnung / einen Fehler auf und kann einen Kommentar im Code rechtfertigen. Ich würde die SUMMethode bevorzugen .
Richard
4
Bevorzugen count(*)zucount(1)
Lei Zhao
61
Wenn ich es richtig verstanden habe, möchten Sie alle NULL und alle NICHT NULL in einer Spalte zählen ...
Wenn das richtig ist:
SELECT count(*)FROM us WHERE a ISNULLUNIONALLSELECT count(*)FROM us WHERE a ISNOTNULL
Nach dem Lesen der Kommentare bearbeitet, um die vollständige Abfrage zu erhalten:]
SELECT COUNT(*),'null_tally'AS narrative
FROM us
WHERE a ISNULLUNIONSELECT COUNT(*),'not_null_tally'AS narrative
FROM us
WHERE a ISNOTNULL;
+1: Bei weitem der einfachste und schnellste Weg. Ich war schockiert, als nicht jede Antwort so war.
Eric
6
Ja aber nein. Ich denke, er möchte die Nummer NULL und nicht NULL in nur einer Abfrage haben ... Sie sagen, wie das in zwei Abfragen gemacht wird ...
Romain Linsolas
@ Romaintaz: Ganz richtig. Ich habe den Titel als Frage gelesen. In fünf Änderungen dachte niemand daran, das Problem zu beheben. Ja.
Eric
@romaintaz: Ja, Sie haben Recht, ich habe dies als "einmalige Abfrage ausführen, um festzustellen, wie viele Nullen wir haben", ich weiß nicht einmal warum ^^ ', korrigiert, danke.
Alberto Zaccagni
1
@Montecristo: Weil der Titel nur zählen wollte null:)
Eric
42
Hier ist eine schnelle und schmutzige Version, die unter Oracle funktioniert:
select sum(case a whennullthen1else0)"Null values",
sum(case a whennullthen0else1)"Non-null values"from us
Eine ähnliche Syntax würde auch in SQL Server funktionieren. Wenn Sie dies auf diese Weise tun, wird die Tabelle nur einmal gescannt. Die UNION-Lösungen führen zwei Tabellenscans durch. Für kleine Tische irrelevant, für große sehr wichtig.
Philip Kelley
2
Nur eine Änderung für SQL Server "Null values"müsste werden 'Null values'. Einfache Anführungszeichen, keine doppelten.
Eric
1
SQLServer verwendet einen Index - Scan für diese Abfrage vs zwei Index sucht eine Vereinigung mit. Bei einer Tabelle mit 40.000 Zeilen gibt es keinen Geschwindigkeitsunterschied.
Lieven Keersmaekers
1
In einer Tabelle mit 11.332.581 Zeilen gibt es zwei Tabellenscans , bei denen kein Geschwindigkeitsunterschied erkennbar ist (tatsächlich ist die Vereinigung etwas schneller).
Lieven Keersmaekers
1
Dies hat bei mir in Oracle 11g nicht funktioniert. Die Version @ user155789 mit "case wenn a null ist, dann 1 else 0 end" war die Syntax, die funktionierte.
Steve
25
Wie ich Ihre Abfrage verstanden habe, führen Sie einfach dieses Skript aus und erhalten Total Null, Total NotNull Zeilen,
Gute Soße, Mann, sehen Sie sich die Ausführungspläne für diese Abfragen an. Sie starten Tischscans von links und rechts, besonders wenn es eine so verdammt einfache Aussage ( select count(*) from t where a is null) gibt, die dies tut.
Eric
2
Ich habe keine Datenbank zur Hand, aber entweder ist die Spalte indiziert oder nicht. Wenn dies der Fall ist, erfolgt dies über einen Entfernungsscan. Andernfalls bleibt Ihnen ein vollständiger Tabellenscan. In Oracle werden NULL-Werte nicht im Index gespeichert, daher vermute ich, dass Ihr Beispiel nicht viel besser ist. Ihre Laufleistung kann sehr.
EvilTeach
1
@EvilTeach: Indizes sind nur hilfreich, wenn Sie nicht> ~ 10% der Zeilen zurückziehen. Danach werden vollständige Scans gestartet. In diesem Fall erhalten Sie den Scan mindestens einmal, wenn nicht zweimal.
Eric
19
Normalerweise benutze ich diesen Trick
select sum(casewhen a isnullthen0else1end)as count_notnull,
sum(casewhen a isnullthen1else0end)as count_null
from tab
groupby a
Wie Sie im Bild sehen können, zeigt das erste Ergebnis, dass die Tabelle 16 Zeilen enthält. von denen zwei Zeilen NULL sind. Wenn wir also Count (*) verwenden, zählt die Abfrage-Engine die Anzahl der Zeilen. Wir haben also das Count-Ergebnis als 16. Bei Count (empid) wurden jedoch die Nicht-NULL-Werte in der Spalte empid gezählt . Also haben wir das Ergebnis als 14 erhalten.
Wenn wir also COUNT (Spalte) verwenden, achten Sie darauf, dass die NULL-Werte wie unten gezeigt berücksichtigt werden.
select COUNT(isnull(empid,1))from@table1
zählt sowohl NULL- als auch Nicht-NULL-Werte.
Hinweis : Dasselbe gilt auch dann, wenn die Tabelle aus mehr als einer Spalte besteht. Count (1) gibt die Gesamtzahl der Zeilen unabhängig von den NULL- / Nicht-NULL-Werten an. Nur wenn die Spaltenwerte mit Count (Column) gezählt werden, müssen wir uns um NULL-Werte kümmern.
Ich hatte ein ähnliches Problem: alle unterschiedlichen Werte zu zählen und auch Nullwerte als 1 zu zählen. Eine einfache Zählung funktioniert in diesem Fall nicht, da Nullwerte nicht berücksichtigt werden.
Hier ist ein Snippet, das unter SQL funktioniert und keine Auswahl neuer Werte beinhaltet. Grundsätzlich geben Sie nach dem Ausführen der Unterscheidung auch die Zeilennummer in einer neuen Spalte (n) mit der Funktion row_number () zurück und führen Sie dann eine Zählung für diese Spalte durch:
SELECT COUNT(n)FROM(SELECT*, row_number()OVER(ORDERBY[MyColumn]ASC) n
FROM(SELECTDISTINCT[MyColumn]FROM[MyTable]) items
) distinctItems
Dies ist auch eine würdige Antwort. Ich persönlich fand, dass COUNT (DISTINCT ISNULL (A, '')) noch besser funktioniert als COUNT (DISTINCT A) + SUM (FALL, WENN A NULL IST, DANN 1 ELSE 0 END)
Vladislav
1
Wenn es MySQL ist, können Sie so etwas versuchen.
select(select count(*)from TABLENAME WHERE a ='null')as total_null,(select count(*)from TABLENAME WHERE a !='null')as total_not_null
FROM TABLENAME
SELECT SUM(NULLs)AS'NULLS', SUM(NOTNULLs)AS'NOTNULLs'FROM(select count(*)AS'NULLs',0as'NOTNULLs'FROM us WHERE a isnullUNIONselect0as'NULLs', count(*)AS'NOTNULLs'FROM us WHERE a isnotnull)AS x
Es ist flüchtig, aber es wird ein einzelner Datensatz mit 2 Spalten zurückgegeben, der die Anzahl der Nullen gegenüber Nicht-Nullen angibt.
Dies funktioniert in T-SQL. Wenn Sie nur die Anzahl von etwas zählen und die Nullen einschließen möchten, verwenden Sie COALESCE anstelle von Groß- und Kleinschreibung.
IF OBJECT_ID('tempdb..#us')ISNOTNULLDROPTABLE#us
CREATETABLE#us
(
a INT NULL);INSERTINTO#us VALUES(1),(2),(3),(4),(NULL),(NULL),(NULL),(8),(9)SELECT*FROM#us
SELECTCASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'ENDAS'NULL?',
COUNT(CASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'END)AS'Count'FROM#us
GROUPBYCASEWHEN a ISNULLTHEN'NULL'ELSE'NON-NULL'ENDSELECTCOALESCE(CAST(a AS NVARCHAR),'NULL')AS a,
COUNT(COALESCE(CAST(a AS NVARCHAR),'NULL'))AS'Count'FROM#us
GROUPBYCOALESCE(CAST(a AS NVARCHAR),'NULL')
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Vishal Chhodwani
1
Alle Antworten sind entweder falsch oder extrem veraltet.
Die einfache und korrekte Art, diese Abfrage durchzuführen, ist die Verwendung der COUNT_IFFunktion.
SELECT
COUNT_IF(a ISNULL)AS nulls,
COUNT_IF(a ISNOTNULL)AS not_nulls
FROM
us
a IS NULLerzeugt TRUEoder FALSE, und COUNT () zählt alle NOT NULL-Werte. Gibt also count(a is null)die Anzahl aller Zeilen zurück.
Ypresto
0
In meinem Fall wollte ich die " Nullverteilung " auf mehrere Spalten:
SELECT(CASEWHEN a ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS a_null,(CASEWHEN b ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS b_null,(CASEWHEN c ISNULLTHEN'NULL'ELSE'NOT-NULL'END)AS c_null,...
count(*)FROM us
GROUPBY1,2,3,...ORDERBY1,2,3,...
Gemäß dem '...' kann es leicht auf mehr Spalten erweitert werden, so viele wie nötig
union
hier ein verwenden? Montecristos Antwort ist bei weitem die beste Lösung.Antworten:
Dies funktioniert für Oracle und SQL Server (möglicherweise können Sie es auf einem anderen RDBMS zum Laufen bringen):
Oder:
quelle
count(*)
undcount(a)
funktioniert auch gut mitgroup by
COUNT(a)
ist ein nützlicher Kommentar zum Hinzufügen, aber dies wirft abhängig von Ihrem Stapel eine Warnung / einen Fehler auf und kann einen Kommentar im Code rechtfertigen. Ich würde dieSUM
Methode bevorzugen .count(*)
zucount(1)
Wenn ich es richtig verstanden habe, möchten Sie alle NULL und alle NICHT NULL in einer Spalte zählen ...
Wenn das richtig ist:
Nach dem Lesen der Kommentare bearbeitet, um die vollständige Abfrage zu erhalten:]
quelle
null
:)Hier ist eine schnelle und schmutzige Version, die unter Oracle funktioniert:
quelle
"Null values"
müsste werden'Null values'
. Einfache Anführungszeichen, keine doppelten.Wie ich Ihre Abfrage verstanden habe, führen Sie einfach dieses Skript aus und erhalten Total Null, Total NotNull Zeilen,
quelle
für Nicht-Nullen
für Nullen
Daher
sollte den Job machen
Besser, dass die Spaltentitel korrekt herauskommen.
Bei einigen Tests auf meinem System kostet es einen vollständigen Tabellenscan.
quelle
select count(*) from t where a is null
) gibt, die dies tut.Normalerweise benutze ich diesen Trick
quelle
Nur um eine weitere Alternative bereitzustellen, ermöglicht
FILTER
Postgres 9.4+ das Anwenden von a auf Aggregate :SQLFiddle: http://sqlfiddle.com/#!17/80a24/5
quelle
Das ist etwas knifflig. Angenommen, die Tabelle hat nur eine Spalte, dann ergeben Count (1) und Count (*) unterschiedliche Werte.
Abfrageergebnisse
Wie Sie im Bild sehen können, zeigt das erste Ergebnis, dass die Tabelle 16 Zeilen enthält. von denen zwei Zeilen NULL sind. Wenn wir also Count (*) verwenden, zählt die Abfrage-Engine die Anzahl der Zeilen. Wir haben also das Count-Ergebnis als 16. Bei Count (empid) wurden jedoch die Nicht-NULL-Werte in der Spalte empid gezählt . Also haben wir das Ergebnis als 14 erhalten.
Wenn wir also COUNT (Spalte) verwenden, achten Sie darauf, dass die NULL-Werte wie unten gezeigt berücksichtigt werden.
zählt sowohl NULL- als auch Nicht-NULL-Werte.
Hinweis : Dasselbe gilt auch dann, wenn die Tabelle aus mehr als einer Spalte besteht. Count (1) gibt die Gesamtzahl der Zeilen unabhängig von den NULL- / Nicht-NULL-Werten an. Nur wenn die Spaltenwerte mit Count (Column) gezählt werden, müssen wir uns um NULL-Werte kümmern.
quelle
Ich hatte ein ähnliches Problem: alle unterschiedlichen Werte zu zählen und auch Nullwerte als 1 zu zählen. Eine einfache Zählung funktioniert in diesem Fall nicht, da Nullwerte nicht berücksichtigt werden.
Hier ist ein Snippet, das unter SQL funktioniert und keine Auswahl neuer Werte beinhaltet. Grundsätzlich geben Sie nach dem Ausführen der Unterscheidung auch die Zeilennummer in einer neuen Spalte (n) mit der Funktion row_number () zurück und führen Sie dann eine Zählung für diese Spalte durch:
quelle
Hier sind zwei Lösungen:
ODER
quelle
Versuchen
Einfach!
quelle
Versuche dies..
quelle
Wenn Sie MS SQL Server verwenden ...
Ich empfehle Ihnen nicht, dies zu tun ... aber hier haben Sie es (in derselben Tabelle wie das Ergebnis)
quelle
Verwenden Sie die eingebettete ISNULL-Funktion.
quelle
Wenn es MySQL ist, können Sie so etwas versuchen.
quelle
Es ist flüchtig, aber es wird ein einzelner Datensatz mit 2 Spalten zurückgegeben, der die Anzahl der Nullen gegenüber Nicht-Nullen angibt.
quelle
Dies funktioniert in T-SQL. Wenn Sie nur die Anzahl von etwas zählen und die Nullen einschließen möchten, verwenden Sie COALESCE anstelle von Groß- und Kleinschreibung.
quelle
Aufbauend auf Alberto habe ich das Rollup hinzugefügt.
quelle
quelle
quelle
Alle Antworten sind entweder falsch oder extrem veraltet.
Die einfache und korrekte Art, diese Abfrage durchzuführen, ist die Verwendung der
COUNT_IF
Funktion.quelle
Nur für den Fall, dass Sie es in einem einzigen Datensatz wollten:
;-);
quelle
zum Zählen von nicht null Werten
zum Zählen von Nullwerten
quelle
Ich habe die Tabelle in Postgres 10 erstellt und beide der folgenden Funktionen haben funktioniert:
select count(*) from us
und
select count(a is null) from us
quelle
a IS NULL
erzeugtTRUE
oderFALSE
, und COUNT () zählt alle NOT NULL-Werte. Gibt alsocount(a is null)
die Anzahl aller Zeilen zurück.In meinem Fall wollte ich die " Nullverteilung " auf mehrere Spalten:
Gemäß dem '...' kann es leicht auf mehr Spalten erweitert werden, so viele wie nötig
quelle
Anzahl der Elemente, bei denen a null ist:
Anzahl der Elemente, bei denen a nicht null ist:
quelle