Предупреждение: значение Null исключается агрегатной или другой операцией SET в Aqua Data Studio
У меня проблема, когда данные равны нулю, а предупреждение появляется при отображении результата.
Как решить эту проблему?. Как изменить нулевые данные на 0, когда в таблице нет данных?.
Это мой код: -
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
Результат выглядит следующим образом: -
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
для суммирования по UID. Поэтому
COUNT([uid])
выдаст предупреждение:
Предупреждение: значение Null исключается агрегированием или другой операцией SET.
при использовании с левым соединением, где подсчитанный объект не существует.
Использование COUNT(*)
в этом случае также приведет к неправильным результатам, так как вы должны были бы подсчитать общее количество полученных результатов (т.е. родителей).
Использование COUNT([uid])
Является допустимым способом подсчета, а предупреждение - не более чем предупреждение. Однако если вы заинтересованы, и вы хотите получить истинное количество uids в этом случае, вы можете использовать:
SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]
Это не добавило бы много накладных расходов на ваш запрос.
(проверено mssql 2008)
Ответ 2
Один из способов решения этой проблемы - отключить предупреждения.
SET ANSI_WARNINGS OFF;
GO
Ответ 3
Использовать ISNULL(field, 0)
Он также может использоваться с агрегатами:
ISNULL(count(field), 0)
Однако вы можете подумать об изменении count(field) to count(*)
Edit:
попробовать:
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),
Ответ 4
Вы хотите поместить ISNULL
внутрь функции COUNT
, а не снаружи:
Не GOOD: ISNULL(COUNT(field), 0)
ХОРОШЕЕ: COUNT(ISNULL(field, 0))
Ответ 5
Если какое-либо значение Null существует внутри агрегатной функции, вы столкнетесь с этой проблемой.
Вместо кода ниже
SELECT Count(closed)
FROM ticket
WHERE assigned_to = c.user_id
AND closed IS NULL
используйте как
SELECT Count(ISNULL(closed, 0))
FROM ticket
WHERE assigned_to = c.user_id
AND closed IS NULL