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 en 0 quand aucune donnée dans la table?.
Ceci est 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)
Vous utiliseriez principalement COUNT
pour résumer sur un UID. Donc
COUNT([uid])
produira l'avertissement:
Avertissement: La valeur Null 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.
Dans ce cas, utiliser COUNT(*)
rendrait également des résultats incorrects, car vous compteriez alors le nombre total de résultats (c.-à-d. Les parents) existants.
En utilisant COUNT([uid])
IS une méthode de comptage valide, l'avertissement n'est rien d'autre qu'un avertissement. Toutefois, si vous êtes concerné et que vous souhaitez obtenir un nombre exact d'uid 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)
Un moyen de résoudre ce problème consiste à désactiver les avertissements.
SET ANSI_WARNINGS OFF;
GO
Utilisez 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(*)
Modifier:
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),
Vous voulez mettre la ISNULL
à l'intérieur de la fonction COUNT
, pas à l'extérieur:
Pas BON: ISNULL(COUNT(field), 0)
BON: COUNT(ISNULL(field, 0))