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)
sql
sql-server-2005
Amin SCO
la source
la source
Count(closed) ... WHERE ... closed IS NULL
n'a aucun sens carCOUNT
ne compte que lesNOT NULL
valeursRéponses:
Vous utiliseriez principalement
COUNT
pour résumer sur un UID. Par conséquentCOUNT([uid])
produira l'avertissement: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:Cela n'ajouterait pas beaucoup de frais généraux à votre requête. (testé mssql 2008)
la source
count([uid])
, cela fonctionnerait-il à utilisercount(1)
?Une façon de résoudre ce problème consiste à désactiver les avertissements.
la source
SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Utilisation
ISNULL(field, 0)
Il peut également être utilisé avec des agrégats:Cependant, vous pourriez envisager de changer
count(field) to count(*)
Éditer:
essayer:
la source
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).Vous voulez mettre l'
ISNULL
intérieur de laCOUNT
fonction, pas à l'extérieur:Pas bon:
ISNULL(COUNT(field), 0)
BIEN:
COUNT(ISNULL(field, 0))
la source
count(ISNULL(field, 0))
sera équivalent àcount(*)
, car la valeur comptée ne pourra plus jamais l'êtreNULL
.COUNT(ISNULL(field, 0))
différenceCOUNT(*)
, faites-le, SQL Fiddle facilite le partage d'un tel contre-exemple. Mais vous ne pourrez pas. PuisqueCOUNT
compte les valeurs non nulles même si elles sont nulles, etISNULL(field, 0)
est toujours une valeur non nulle,COUNT(ISNULL(field, 0))
compte les lignes. C'est à cela queCOUNT(*)
sert et non à quoi sert le PO ici.group by
requê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 alorsCOUNT(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.J'obtenais cette erreur; Je viens de mettre une
WHERE
clause pour le champ qui a été utilisé dans lacount
clause. 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:
Nouvelle requête:
la source
Si une valeur Null existe dans la fonction d'agrégation, vous serez confronté à ce problème. Au lieu du code ci-dessous
utiliser comme
la source