Advertencia: el valor nulo se elimina mediante un agregado u otra operación SET en Aqua Data Studio

95

Tengo un problema cuando los datos son nulos y aparece la advertencia cuando se muestra el resultado. ¿Cómo resolver este problema?. ¿Cómo cambiar los datos nulos a 0 cuando no hay datos en la tabla ?.

Este es mi código: -

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 

El resultado aparece así: -

 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
fuente
1
Count(closed) ... WHERE ... closed IS NULLno tiene ningún sentido ya que COUNTsolo cuenta NOT NULLvalores
Martin Smith
Recibo la misma advertencia. No me importa la advertencia en sí misma, pero necesito que el agente SQL ejecute el procedimiento almacenado y, cuando lo hago, la advertencia hace que el trabajo del agente falle.
RichieACC
Esta pregunta no tiene sentido.
xr280xr

Respuestas:

102

Lo utilizaría principalmente COUNTpara resumir sobre un UID. Por lo tanto

COUNT([uid]) producirá la advertencia:

Advertencia: el valor nulo se elimina mediante un agregado u otra operación SET.

mientras se utiliza con una combinación izquierda, donde el objeto contado no existe.

El uso COUNT(*)en este caso también generaría resultados incorrectos, ya que estaría contando el número total de resultados (es decir, padres) que existen.

Usar COUNT([uid])IS es una forma válida de contar, y la advertencia no es más que una advertencia. Sin embargo, si está preocupado y desea obtener un recuento real de uids en este caso, puede usar:

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

Esto no agregaría muchos gastos generales a su consulta. (probado mssql 2008)

Mat Traherne
fuente
1
Busqué e intenté sin éxito, pero el uso de NULLIF junto con ISNULL me salvó. Puede probar la combinación de estos dos, por ejemplo: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster
¿No sería la solución específicamente para la columna "casos abiertos" más simple que simplemente "seleccionar recuento (1) ..." (o "recuento" de cualquier otro literal)? La cláusula Where ya especifica "y cerrado es NULL", por lo que no es necesario sumar una declaración de caso en este caso. Además, escuché (hace eones) que "contar (*)" no es tan eficiente como contar una sola columna o literal, pero no estoy seguro de si ese sigue siendo el caso.
RowanPD
En lugar de count([uid]), ¿funcionaría usarlo count(1)?
Farhan
Usted señor @Mat Traherne me salvó :) Conseguí esto tratando de conectar datos en un archivo de Excel, ya tenía un ISNULL (x, y) pero eso no funcionó, sin embargo "SUM (CASE WHEN X IS NULL THEN 0 ELSE X FIN) ¡AS Z "funcionó muy bien! ¡Gracias!
Dimitri
20

Una forma de resolver este problema es desactivando las advertencias.

SET ANSI_WARNINGS OFF;
GO
Mukus
fuente
30
Desde msdn , esto no solo cambia las advertencias sobre nulos en los agregados, sino que también modifica el manejo de los errores de división por cero y desbordamiento. Esto hace que esta solución sea "no válida" para mí.
Frédéric
3
¿Por qué lo considera un problema de todos modos? es solo informativo
Martin Smith
2
@Mukus - No, no lo hace. Imprime un mensaje en el nivel de gravedad 10. Cualquier valor de 10 o menos es informativo y no se considera un error. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith
5
@RichieACC Sí, porque esta no es una respuesta, y deshabilitar las advertencias ANSI extremadamente deseables como una forma perezosa de evitar un mensaje informativo causará rupturas en muchas otras cosas claramente no informativas.
underscore_d
3
La solución para que las luces de advertencia de su automóvil estén encendidas es simplemente desenchufar el tablero. Esta es probablemente la peor respuesta que he visto en stackoverflow.
VoronoiPotato
17

Utilización ISNULL(field, 0)También se puede utilizar con áridos:

ISNULL(count(field), 0)

Sin embargo, podría considerar cambiar count(field) to count(*)

Editar:

tratar:

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
fuente
Lo intenté pero el (nulo) todavía existe en la fila. ¿Cómo cambiar este valor a 0 cuando los datos son nulos?
Amin SCO
gracias, pero el valor no nulo también tiene el mismo problema cuando aparece el valor nulo. ¿Cómo cambiar el valor a 0 ?.
Amin SCO
1
FYI: ISNULL(count(field), 0)no funcionó para mí en MSSQL 2008 R2. El problema era porque estaba tratando de contar un campo en una tabla unida externa izquierda para obtener el número de registros en la tabla unida relacionados con la tabla principal. Terminé teniendo que hacer una subconsulta que internamente unió las dos tablas para obtener el recuento por ID en la tabla principal. La subconsulta se dejó unida externamente a la tabla principal en el ID. Luego, el recuento de la subconsulta se envolvió en un ISNULL para obtener el 0 que quería (sin el mensaje de advertencia).
Trisped
1
Chris, debería ser COUNT (ISNULL (Field, 0)) y no al revés. Consultando el formato actual, todo lo que se devolverá es un 0 y no un recuento real. Lógica: Count (campo) devolverá un único NULL para todos los valores de campo que son nulos e ISNULL lo establecerá en 0, devolviendo un 0.
Govind Rai
9

Quieres poner el ISNULLinterior de la COUNTfunción, no el exterior:

No está bien: ISNULL(COUNT(field), 0)

BUENO: COUNT(ISNULL(field, 0))

Ben Garrison
fuente
12
Esto está mal. count(ISNULL(field, 0))será equivalente a count(*), ya que el valor que se está contando ya no puede serlo NULL.
@hvd no está mal, el valor es solo 0 cuando el campo es nulo.
Govind Rai
3
@GovindRai No, realmente está mal. Si cree que puede encontrar un contraejemplo, un ejemplo en el que COUNT(ISNULL(field, 0))sea ​​diferente de COUNT(*), hágalo, SQL Fiddle facilita compartir dicho contraejemplo. Pero no podrás. Dado que COUNTcuenta los valores no nulos incluso si son cero, y ISNULL(field, 0)siempre es un valor no nulo, COUNT(ISNULL(field, 0))cuenta filas. Para eso COUNT(*)es y no para lo que buscaba el OP aquí.
2
@hvd Tienes razón. Mi respuesta se basó en una group byconsulta en un contexto diferente al que buscaba el OP. En mi caso, ISNULL(COUNT(field), 0)devolvería un recuento de 0 para todos los valores NULL que era incorrecto ya que había múltiples valores nulos, mientras COUNT(ISNULL(field),0)que devolvería el recuento correcto para el número total de valores NULL. Pero de nuevo, dos escenarios totalmente diferentes.
Govind Rai
Conseguí que funcionara. ¡Aqui tienes! sqlfiddle.com/#!3/ee0546/2 Ha votado a favor de su comentario lol
Govind Rai
-2

Recibía este error; Solo puse una WHEREcláusula para el campo que se usó dentro de la countcláusula. resolvió el problema. Nota: si existe un valor nulo, verifique si es crítico para el informe, ya que está excluido en el recuento.

Consulta antigua:

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

Nueva consulta:

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

Si existe algún valor nulo dentro de la función agregada, se enfrentará a este problema. En lugar del código siguiente

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

usar como

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