Avertissement: la valeur nulle est éliminée par un agrégat ou une autre opération SET dans Aqua Data Studio

95

J'ai un problème lorsque les données sont nulles et que l'avertissement apparaît lorsque le résultat est affiché. Comment résoudre ce problème?. Comment changer les données nulles à 0 quand aucune donnée dans la table?.

Voici mon 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 

Le résultat apparaît comme ceci: -

 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
la source
1
Count(closed) ... WHERE ... closed IS NULLn'a aucun sens car COUNTne compte que les NOT NULLvaleurs
Martin Smith
Je reçois le même avertissement. L'avertissement en lui-même ne me dérange pas, mais j'ai besoin que la procédure stockée soit exécutée par l'agent SQL, et lorsque je le fais, l'avertissement entraîne l'échec du travail de l'agent.
RichieACC du
Cette question n'a pas de sens.
xr280xr

Réponses:

101

Vous utiliseriez principalement COUNTpour résumer sur un UID. Par conséquent

COUNT([uid]) produira l'avertissement:

Avertissement: la valeur nulle est éliminée par un agrégat ou une autre opération SET.

tout en étant utilisé avec une jointure à gauche, où l'objet compté n'existe pas.

L'utilisation COUNT(*)dans ce cas rendrait également des résultats incorrects, car vous compteriez alors le nombre total de résultats (c'est-à-dire les parents) qui existent.

Utiliser COUNT([uid])IS est un moyen valide de compter, et l'avertissement n'est rien de plus qu'un avertissement. Cependant, si vous êtes concerné et que vous souhaitez obtenir un nombre réel d'uids dans ce cas, vous pouvez utiliser:

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

Cela n'ajouterait pas beaucoup de frais généraux à votre requête. (testé mssql 2008)

Mat Traherne
la source
1
J'ai donc cherché et essayé sans succès mais l'utilisation de la conjonction NULLIF avec ISNULL m'a sauvé, vous pouvez essayer la combinaison de ces deux par exemple: ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster
La solution spécifique pour la colonne "opencases" ne serait-elle pas plus simple comme simplement "select count (1) ..." (ou "count" de tout autre littéral)? La clause Where spécifie déjà "et fermé est NULL" donc pas besoin de sommer une instruction case dans cette instance. De plus, j'ai entendu (il y a des éons) que "count (*)" n'est pas aussi efficace que de compter une seule colonne ou un littéral, mais je ne sais pas si c'est toujours le cas.
RowanPD
Au lieu de count([uid]), cela fonctionnerait-il à utiliser count(1)?
Farhan le
Vous monsieur @Mat Traherne m'a sauvé :) J'ai essayé de connecter des données dans un fichier Excel, j'avais déjà un ISNULL (x, y) mais cela ne fonctionnait pas, cependant "SUM (CASE WHEN X IS NULL THEN 0 ELSE X FIN) AS Z "a très bien fonctionné! Merci!
Dimitri
20

Une façon de résoudre ce problème consiste à désactiver les avertissements.

SET ANSI_WARNINGS OFF;
GO
Mukus
la source
30
À partir de msdn , cela ne modifie pas seulement les avertissements concernant la valeur null dans les agrégats, mais modifie également la gestion des erreurs de division par zéro et de dépassement de capacité. Cela fait que cette solution est un «non» pour moi.
Frédéric
3
Pourquoi considérez-vous cela comme un problème de toute façon? il est juste informatif
Martin Smith
2
@Mukus - Non, ce n'est pas le cas. Il imprime un message au niveau de gravité 10. Tout élément 10 ou inférieur est informatif et n'est pas considéré comme une erreur. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith
5
@RichieACC Oui, parce que ce n'est pas une réponse, et la désactivation des avertissements ANSI extrêmement souhaitables comme moyen paresseux d'éviter un message informatif provoquera la rupture de nombreuses autres choses distinctement non informatives.
underscore_d
3
La solution à l'allumage des voyants de votre voiture consiste simplement à débrancher le tableau de bord. C'est probablement la pire réponse que j'ai jamais vue sur stackoverflow.
VoronoiPotato
17

Utilisation ISNULL(field, 0)Il peut également être utilisé avec des agrégats:

ISNULL(count(field), 0)

Cependant, vous pourriez envisager de changer count(field) to count(*)

Éditer:

essayer:

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
la source
J'ai essayé mais le (nul) existe toujours en ligne. Comment changer cette valeur à 0 lorsque les données sont nulles?
Amin SCO
merci, mais la valeur non nulle a également le même problème lorsque la valeur nulle apparaît. comment changer la valeur à 0?.
Amin SCO
1
FYI: ISNULL(count(field), 0)n'a pas fonctionné pour moi dans MSSQL 2008 R2. Le problème était dû au fait que j'essayais de compter un champ dans une table jointe externe gauche pour obtenir le nombre d'enregistrements dans la table jointe liés à la table principale. J'ai fini par devoir faire une sous-requête qui rejoignait les deux tables pour obtenir le nombre par ID dans la table principale. La sous-requête a été laissée externe jointe à la table principale sur l'ID. Le compte de la sous-requête a ensuite été enveloppé dans un ISNULL pour obtenir le 0 que je voulais (sans le message d'avertissement).
Trisped
1
Chris, ça devrait être COUNT (ISNULL (Field, 0)) et non l'inverse. En interrogeant le format actuel, tout ce qui sera renvoyé est un 0 et non un nombre réel. Logique: Count (field) renverra un seul NULL pour toutes les valeurs de champ nulles et ISNULL le mettra à 0, renvoyant un 0.
Govind Rai
9

Vous voulez mettre l' ISNULLintérieur de la COUNTfonction, pas à l'extérieur:

Pas bon: ISNULL(COUNT(field), 0)

BIEN: COUNT(ISNULL(field, 0))

Ben Garrison
la source
12
C'est faux. count(ISNULL(field, 0))sera équivalent à count(*), car la valeur comptée ne pourra plus jamais l'être NULL.
@hvd ce n'est pas faux, la valeur n'est que de 0 lorsque le champ est nul.
Govind Rai
3
@GovindRai Non, c'est vraiment faux. Si vous pensez pouvoir proposer un contre-exemple, un exemple de COUNT(ISNULL(field, 0))différence COUNT(*), faites-le, SQL Fiddle facilite le partage d'un tel contre-exemple. Mais vous ne pourrez pas. Puisque COUNTcompte les valeurs non nulles même si elles sont nulles, et ISNULL(field, 0)est toujours une valeur non nulle, COUNT(ISNULL(field, 0))compte les lignes. C'est à cela que COUNT(*)sert et non à quoi sert le PO ici.
2
@hvd Vous avez raison. Ma réponse était basée sur une group byrequête dans un contexte différent de ce qu'était le PO. Dans mon cas, ISNULL(COUNT(field), 0)retournerait un compte de 0 pour toutes les valeurs NULL, ce qui était incorrect car il y avait plusieurs valeurs nulles alors COUNT(ISNULL(field),0)que retournerait le compte correct pour le nombre total de valeurs NULL. Mais encore une fois, deux scénarios totalement différents.
Govind Rai
Ça marche. Voici! sqlfiddle.com/#!3/ee0546/2 A voté pour votre commentaire lol
Govind Rai
-2

J'obtenais cette erreur; Je viens de mettre une WHEREclause pour le champ qui a été utilisé dans la countclause. cela a résolu le problème. Remarque: si une valeur nulle existe, vérifiez si elle est critique pour le rapport, car elle est exclue du décompte.

Ancienne requête:

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

Nouvelle requête:

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

Si une valeur Null existe dans la fonction d'agrégation, vous serez confronté à ce problème. Au lieu du code ci-dessous

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

utiliser comme

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