Avvertenza: il valore nullo viene eliminato da un'aggregazione o da un'altra operazione SET in Aqua Data Studio


95

Ho un problema quando i dati sono nulli e viene visualizzato l'avviso quando viene visualizzato il risultato. Come risolvere questo problema ?. Come modificare i dati nulli su 0 quando non ci sono dati nella tabella ?.

Questo è il mio codice: -

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 

Il risultato appare così: -

 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)     

1
Count(closed) ... WHERE ... closed IS NULLnon ha alcun senso in quanto COUNTconta solo i NOT NULLvalori
Martin Smith


Ricevo lo stesso avvertimento. Non mi interessa l'avviso in sé e per sé, ma ho bisogno che la procedura memorizzata venga eseguita dall'agente SQL e, quando lo faccio, l'avviso fa fallire il lavoro dell'agente.
RichieACC

Questa domanda non ha senso.
xr280xr

Risposte:


102

Lo useresti principalmente COUNTper riassumere su un UID. Perciò

COUNT([uid]) produrrà l'avviso:

Avviso: il valore nullo viene eliminato da un'operazione di aggregazione o da un'altra operazione SET.

pur essendo utilizzato con un join sinistro, dove l'oggetto contato non esiste.

L'utilizzo COUNT(*)in questo caso restituirebbe anche risultati errati, poiché in tal caso si conterebbe il numero totale di risultati (ovvero i genitori) esistenti.

L'uso di COUNT([uid])IS è un modo valido per contare e l'avviso non è altro che un avviso. Tuttavia, se sei preoccupato e vuoi ottenere un conteggio reale degli uid in questo caso, potresti usare:

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

Ciò non aggiungerebbe molte spese generali alla tua query. (testato mssql 2008)


1
Ho cercato e provato senza successo, ma l'uso di NULLIF insieme a ISNULL mi ha salvato, puoi provare una combinazione di questi due ad esempio: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster

La soluzione specifica per la colonna "opencases" non sarebbe più semplice come semplicemente "select count (1) ..." (o "count" di qualsiasi altro letterale)? La clausola Where specifica già "e closed è NULL" quindi non è necessario sommare un'istruzione case in questa istanza. Inoltre, ho sentito (eoni fa) che "count (*)" non è efficiente come contare una singola colonna o letterale ma non sono sicuro che sia ancora così.
RowanPD

Invece di count([uid]), funzionerebbe da usare count(1)?
Farhan

Signore @Mat Traherne mi ha salvato :) Ho ottenuto questo cercando di connettere i dati in un file Excel, avevo già un ISNULL (x, y) ma non ha funzionato, tuttavia "SUM (CASE WHEN X IS NULL THEN 0 ELSE X END) AS Z "ha funzionato alla grande! Grazie!
Dimitri

20

Un modo per risolvere questo problema è disattivare gli avvisi.

SET ANSI_WARNINGS OFF;
GO

30
Da msdn , ciò non solo modifica gli avvisi relativi a null negli aggregati, ma modifica anche la gestione degli errori di divisione per zero e di overflow. Questo fa sì che questa soluzione sia un "no go" per me.
Frédéric

3
Perché lo consideri comunque un problema? è solo informativo
Martin Smith

2
@ Mukus - No, non lo fa. Stampa un messaggio al livello di gravità 10. Qualsiasi valore pari a 10 o inferiore è informativo non considerato un errore. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith,

5
@RichieACC Sì, perché questa non è una risposta, e disabilitare gli avvisi ANSI estremamente desiderabili come un modo pigro per evitare un messaggio informativo causerà interruzioni in molte altre cose chiaramente non informative.
underscore_d

3
La soluzione per l'accensione delle spie della tua auto è semplicemente scollegare il cruscotto. Questa è probabilmente la risposta peggiore che abbia mai visto su stackoverflow.
VoronoiPotato

17

Utilizzo ISNULL(field, 0)Può essere utilizzato anche con aggregati:

ISNULL(count(field), 0)

Tuttavia, potresti considerare di cambiare count(field) to count(*)

Modificare:

provare:

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),

ho provato ma il (null) esiste ancora nella riga. Come modificare questo valore su 0 quando i dati sono nulli?
Amin SCO

grazie ma anche il valore non nullo ha lo stesso problema quando viene visualizzato il nullo. come cambiare il valore a 0 ?.
Amin SCO

1
FYI: ISNULL(count(field), 0)non ha funzionato per me in MSSQL 2008 R2. Il problema era perché stavo cercando di contare un campo in una tabella unita esterna sinistra per ottenere il numero di record nella tabella unita relativa alla tabella principale. Ho finito per dover fare una sottoquery che ha unito le due tabelle per ottenere il conteggio per ID nella tabella principale. La sottoquery è stata lasciata esterna unita alla tabella principale sull'ID. Il conteggio della sottoquery è stato quindi racchiuso in un ISNULL per ottenere lo 0 che volevo (senza il messaggio di avviso).
Trisped

1
Chris, dovrebbe essere COUNT (ISNULL (Field, 0)) non il contrario. Interrogando il formato corrente, tutto ciò che verrà restituito è uno 0 e non un conteggio reale. Logica: Count (field) restituirà un singolo NULL per tutti i valori di campo che sono nulli e ISNULL lo imposterà a 0, restituendo uno 0.
Govind Rai

9

Vuoi mettere l' ISNULLinterno della COUNTfunzione, non all'esterno:

Non bene: ISNULL(COUNT(field), 0)

BENE: COUNT(ISNULL(field, 0))


12
Questo è sbagliato. count(ISNULL(field, 0))sarà equivalente a count(*), poiché il valore che si sta contando non potrà più essere mai NULL.

@hvd non è sbagliato, il valore è solo 0 quando il campo è nullo.
Govind Rai

3
@GovindRai No, è davvero sbagliato. Se ritieni di poter trovare un controesempio, un esempio in cui COUNT(ISNULL(field, 0))è diverso COUNT(*), fallo, SQL Fiddle rende facile condividere un tale controesempio. Ma non sarai in grado di farlo. Poiché COUNTconta i valori non nulli anche se sono zero, ed ISNULL(field, 0)è sempre un valore non nullo, COUNT(ISNULL(field, 0))conta le righe. Questo è ciò che COUNT(*)serve e non ciò che l'OP qui stava cercando.

2
@hvd Hai ragione. La mia risposta era basata su una group bydomanda in un contesto diverso da quello che cercava l'OP. Nel mio caso, ISNULL(COUNT(field), 0)restituirebbe un conteggio di 0 per tutti i valori NULL che non era corretto poiché c'erano più valori null mentre COUNT(ISNULL(field),0)restituirebbe il conteggio corretto per il numero totale di valori NULL. Ma ancora, due scenari totalmente diversi.
Govind Rai

Devo funzionare. Ecco qui! sqlfiddle.com/#!3/ee0546/2 ha votato positivamente il tuo commento lol
Govind Rai

-2

Ho ricevuto questo errore; Ho appena inserito una WHEREclausola per il campo che è stato utilizzato all'interno della countclausola. ha risolto il problema. Nota: se esiste un valore nullo, controllare se è critico per il report, poiché è escluso nel conteggio.

Vecchia query:

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

Nuova query:

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

-3

Se esiste un valore Null all'interno della funzione aggregata, dovrai affrontare questo problema. Invece del codice sottostante

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

usa come

SELECT Count(ISNULL(closed, 0))
  FROM   ticket
  WHERE  assigned_to = c.user_id
  AND closed IS NULL
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.