Ich habe ein Problem, wenn die Daten null sind und die Warnung angezeigt wird, wenn das Ergebnis angezeigt wird. Wie kann man dieses Problem lösen? Wie ändere ich die Nulldaten auf 0, wenn keine Daten in der Tabelle sind?
Das ist mein Code: -
SELECT DISTINCT c.username AS assigner_officer,
d.description AS ticketcategory,
(SELECT Count(closed)
FROM ticket
WHERE assigned_to = c.user_id
AND closed IS NOT NULL
GROUP BY assigned_to)closedcases,
(SELECT Count(closed)
FROM ticket
WHERE assigned_to = c.user_id
AND closed IS NULL
GROUP BY assigned_to)opencases
FROM ticket a
JOIN ticketlog b
ON a.ticketid = b.ticketid
JOIN access c
ON a.assigned_to = c.user_id
JOIN ticket_category d
ON a.cat_code = d.id
JOIN lookup_department e
ON a.department_code = e.code
Das Ergebnis sieht folgendermaßen aus:
Warnings: --->
W (1): Warning: Null value is eliminated by an aggregate or other SET operation.
<---
assigner_officer ticketcategory closedcases opencases
------------------- ----------------- -------------- ------------
abdulhafiz Enquiry (null) 0
affan Enquiry 12 (null)
amirul Enquiry 1 (null)
azrul_fahmi Enquiry 45 0
Azwani Enquiry (null) 0
chai Enquiry 4 (null)
dalinawati Enquiry 1 0
Emmy Complaints (null) 0
Fadhlia Enquiry 38 0
fairulhalif Others 1 (null)
farikh Enquiry (null) 0
ismailh Enquiry 28 0
izzahanna Enquiry (null) 0
Kamsuzilawati Enquiry 1 (null)
sql
sql-server-2005
Amin SCO
quelle
quelle
Count(closed) ... WHERE ... closed IS NULL
macht keinen Sinn, daCOUNT
nurNOT NULL
Werte gezählt werdenAntworten:
Sie würden meistens verwenden,
COUNT
um über eine UID zusammenzufassen. DeshalbCOUNT([uid])
wird die Warnung erzeugen:während der Verwendung mit einem linken Join, bei dem das gezählte Objekt nicht vorhanden ist.
Die Verwendung
COUNT(*)
in diesem Fall würde auch zu falschen Ergebnissen führen, da Sie dann die Gesamtzahl der vorhandenen Ergebnisse (dh Eltern) zählen würden.Die Verwendung von
COUNT([uid])
IS ist eine gültige Zählmethode, und die Warnung ist nichts weiter als eine Warnung. Wenn Sie jedoch besorgt sind und in diesem Fall eine echte Anzahl von Uids erhalten möchten, können Sie Folgendes verwenden:Dies würde Ihrer Abfrage nicht viel Overhead hinzufügen. (getestet mssql 2008)
quelle
count([uid])
Würde es stattdessen funktionierencount(1)
?Eine Möglichkeit, dieses Problem zu lösen, besteht darin, die Warnungen auszuschalten.
quelle
SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Verwendung
ISNULL(field, 0)
Es kann auch mit Aggregaten verwendet werden:Sie könnten jedoch eine Änderung in Betracht ziehen
count(field) to count(*)
Bearbeiten:
Versuchen:
quelle
ISNULL(count(field), 0)
hat in MSSQL 2008 R2 bei mir nicht funktioniert. Das Problem war, dass ich versucht habe, ein Feld in einer linken äußeren verbundenen Tabelle zu zählen, um die Anzahl der Datensätze in der verbundenen Tabelle zu ermitteln, die sich auf die Haupttabelle beziehen. Am Ende musste ich eine Unterabfrage durchführen, die die beiden Tabellen miteinander verband, um die Anzahl pro ID in der Haupttabelle zu ermitteln. Die Unterabfrage wurde äußerlich mit der Haupttabelle in der ID verbunden gelassen. Die Anzahl der Unterabfragen wurde dann in einen ISNULL eingeschlossen, um die gewünschte 0 zu erhalten (ohne die Warnmeldung).Sie möchten das
ISNULL
Innere derCOUNT
Funktion und nicht das Äußere platzieren:Nicht gut:
ISNULL(COUNT(field), 0)
GUT:
COUNT(ISNULL(field, 0))
quelle
count(ISNULL(field, 0))
wird gleichbedeutend sein mitcount(*)
, da der Wert, der gezählt wird, niemals mehr sein kannNULL
.COUNT(ISNULL(field, 0))
sich von dem unterscheidetCOUNT(*)
, tun Sie dies bitte. SQL Fiddle macht es einfach, ein solches Gegenbeispiel zu teilen. Aber du wirst es nicht können. DaCOUNT
die Nicht-Null-Werte gezählt werden, auch wenn sie Null sind undISNULL(field, 0)
immer ein Nicht-Null-Wert sind, werden dieCOUNT(ISNULL(field, 0))
Zeilen gezählt. DafürCOUNT(*)
ist da und nicht danach, was das OP hier wollte.group by
Anfrage in einem anderen Kontext als dem, nach dem das OP suchte. In meinem FallISNULL(COUNT(field), 0)
würde eine Anzahl von 0 für alle NULL-Werte zurückgegeben, was falsch war, da mehrere Nullwerte vorhanden waren, währendCOUNT(ISNULL(field),0)
die korrekte Anzahl für die Gesamtzahl der NULL-Werte zurückgegeben würde. Aber auch hier zwei völlig unterschiedliche Szenarien.Ich habe diesen Fehler erhalten. Ich habe gerade eine
WHERE
Klausel für das Feld eingefügt, das in dercount
Klausel verwendet wurde. es löste das Problem. Hinweis: Wenn ein Nullwert vorhanden ist, prüfen Sie, ob er für den Bericht kritisch ist, da er in der Zählung ausgeschlossen ist.Alte Abfrage:
Neue Abfrage:
quelle
Wenn in der Aggregatfunktion ein Nullwert vorhanden ist, tritt dieses Problem auf. Anstelle des folgenden Codes
benutze wie
quelle