Warnung: Der Nullwert wird durch eine aggregierte oder andere SET-Operation in Aqua Data Studio entfernt

94

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)     
Amin SCO
quelle
1
Count(closed) ... WHERE ... closed IS NULLmacht keinen Sinn, da COUNTnur NOT NULLWerte gezählt werden
Martin Smith
Ich bekomme die gleiche Warnung. Die Warnung an und für sich macht mir nichts aus, aber die gespeicherte Prozedur muss vom SQL-Agenten ausgeführt werden. Wenn ich das tue, führt die Warnung dazu, dass der Agent-Job fehlschlägt.
RichieACC
Diese Frage macht keinen Sinn.
xr280xr

Antworten:

99

Sie würden meistens verwenden, COUNTum über eine UID zusammenzufassen. Deshalb

COUNT([uid]) wird die Warnung erzeugen:

Warnung: Der Nullwert wird durch eine aggregierte oder andere SET-Operation entfernt.

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:

SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]

Dies würde Ihrer Abfrage nicht viel Overhead hinzufügen. (getestet mssql 2008)

Mat Traherne
quelle
1
Ich habe so gesucht und erfolglos versucht, aber die Verwendung von NULLIF in Verbindung mit ISNULL hat mich gerettet. Sie können versuchen, diese beiden zu kombinieren, zum Beispiel: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster
Wäre die Lösung speziell für die Spalte "opencases" nicht einfacher als nur "select count (1) ..." (oder "count" eines anderen Literals)? Die Where-Klausel gibt bereits "und geschlossen ist NULL" an, sodass in diesem Fall keine case-Anweisung summiert werden muss. Außerdem habe ich (vor Äonen) gehört, dass "count (*)" nicht so effizient ist wie das Zählen einer einzelnen Spalte oder eines Literals, aber nicht sicher, ob dies immer noch der Fall ist.
RowanPD
count([uid])Würde es stattdessen funktionieren count(1)?
Farhan
Sie, Sir @Mat Traherne, haben mich gerettet :) Ich habe versucht, Daten in einer Excel-Datei zu verbinden, hatte bereits einen ISNULL (x, y), aber das hat nicht funktioniert, jedoch "SUMME (FALL, WENN X NULL IST, DANN 0 SONST X) ENDE) AS Z "hat super funktioniert! Vielen Dank!
Dimitri
19

Eine Möglichkeit, dieses Problem zu lösen, besteht darin, die Warnungen auszuschalten.

SET ANSI_WARNINGS OFF;
GO
Mukus
quelle
29
Ab msdn werden dadurch nicht nur Warnungen vor Null in Aggregaten geändert, sondern auch die Behandlung von Division durch Null und Überlauffehlern. Dies führt dazu, dass diese Lösung für mich ein "No Go" ist.
Frédéric
3
Warum sehen Sie das überhaupt als Problem an? es ist nur informativ
Martin Smith
2
@ Mukus - Nein, tut es nicht. Es wird eine Nachricht mit dem Schweregrad 10 ausgedruckt. Alles, was 10 oder weniger ist, ist informativ und wird nicht als Fehler angesehen. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith
2
Wenn ich ANSI-Warnungen deaktiviere, wird der folgende Fehler angezeigt, sodass dies für mich keine Lösung darstellt. "Für heterogene Abfragen müssen die Optionen ANSI_NULLS und ANSI_WARNINGS für die Verbindung festgelegt werden. Dadurch wird eine konsistente Abfragesemantik sichergestellt. Aktivieren Sie diese Optionen und geben Sie Ihre Abfrage erneut aus."
RichieACC
4
@RichieACC Ja, da dies keine Antwort ist und das Deaktivieren der äußerst wünschenswerten ANSI-Warnungen als träge Methode zum Vermeiden einer Informationsnachricht zu einem Bruch in vielen anderen, eindeutig nicht informativen Dingen führt.
underscore_d
17

Verwendung ISNULL(field, 0)Es kann auch mit Aggregaten verwendet werden:

ISNULL(count(field), 0)

Sie könnten jedoch eine Änderung in Betracht ziehen count(field) to count(*)

Bearbeiten:

Versuchen:

closedcases = ISNULL(
   (select count(closed) from ticket       
    where assigned_to = c.user_id and closed is not null       
    group by assigned_to), 0), 

opencases = ISNULL(
    (select count(closed) from ticket 
     where assigned_to = c.user_id and closed is null 
     group by assigned_to), 0),
Chris Gessler
quelle
Ich habe versucht, aber die (null) existieren noch in der Reihe. Wie ändere ich diesen Wert auf 0, wenn die Daten null sind?
Amin SCO
Vielen Dank, aber der Wert nicht null hat auch das gleiche Problem, wenn der Wert null angezeigt wird. Wie ändere ich den Wert auf 0?.
Amin SCO
1
Zu Ihrer Information: 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).
Trisped
1
Chris, es sollte COUNT (ISNULL (Field, 0)) sein und nicht umgekehrt. Wenn Sie das aktuelle Format abfragen, wird nur eine 0 und keine echte Anzahl zurückgegeben. Logik: Count (Feld) gibt einen einzelnen NULL für alle Feldwerte zurück, die null sind, und ISNULL setzt diesen Wert auf 0 und gibt eine 0 zurück.
Govind Rai
9

Sie möchten das ISNULLInnere der COUNTFunktion und nicht das Äußere platzieren:

Nicht gut: ISNULL(COUNT(field), 0)

GUT: COUNT(ISNULL(field, 0))

Ben Garrison
quelle
12
Das ist falsch. count(ISNULL(field, 0))wird gleichbedeutend sein mit count(*), da der Wert, der gezählt wird, niemals mehr sein kann NULL.
@hvd es ist nicht falsch, der Wert ist nur 0, wenn Feld null ist.
Govind Rai
3
@ GovindRai Nein, es ist wirklich falsch. Wenn Sie glauben, dass Sie ein Gegenbeispiel erstellen können, ein Beispiel, das COUNT(ISNULL(field, 0))sich von dem unterscheidet COUNT(*), tun Sie dies bitte. SQL Fiddle macht es einfach, ein solches Gegenbeispiel zu teilen. Aber du wirst es nicht können. Da COUNTdie Nicht-Null-Werte gezählt werden, auch wenn sie Null sind und ISNULL(field, 0)immer ein Nicht-Null-Wert sind, werden die COUNT(ISNULL(field, 0))Zeilen gezählt. Dafür COUNT(*)ist da und nicht danach, was das OP hier wollte.
2
@hvd Du bist richtig. Meine Antwort basierte auf einer group byAnfrage in einem anderen Kontext als dem, nach dem das OP suchte. In meinem Fall ISNULL(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ährend COUNT(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.
Govind Rai
Ich habe es zum Laufen gebracht. Bitte schön! sqlfiddle.com/#!3/ee0546/2 Upvoted Ihren Kommentar lol
Govind Rai
-2

Ich habe diesen Fehler erhalten. Ich habe gerade eine WHEREKlausel für das Feld eingefügt, das in der countKlausel 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:

select city, Count(Emp_ID) as Emp_Count 
from Emp_DB
group by city

Neue Abfrage:

select city, Count(Emp_ID) as Emp_Count 
from Emp_DB
where Emp_ID is not null
group by city
hariishr
quelle
-3

Wenn in der Aggregatfunktion ein Nullwert vorhanden ist, tritt dieses Problem auf. Anstelle des folgenden Codes

 SELECT Count(closed)
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL

benutze wie

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
Maniv
quelle