У меня проблема, когда данные равны нулю и при отображении результата появляется предупреждение. Как решить эту проблему?. Как изменить нулевые данные на 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)
sql
sql-server-2005
Амин ШОС
источник
источник
Count(closed) ... WHERE ... closed IS NULL
не имеет никакого смысла, посколькуCOUNT
только считаетNOT NULL
значенияОтветы:
Вы в основном будете использовать
COUNT
для суммирования по UID. СледовательноCOUNT([uid])
выдаст предупреждение:при использовании с левым соединением, где подсчитываемый объект не существует.
Использование
COUNT(*)
в этом случае также приведет к неверным результатам, так как тогда вы будете подсчитывать общее количество результатов (т.е. родителей), которые существуют.Использование
COUNT([uid])
IS - допустимый способ подсчета, а предупреждение - не более чем предупреждение. Однако, если вы обеспокоены и хотите получить истинное количество идентификаторов uid в этом случае, вы можете использовать:SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]
Это не добавит много накладных расходов к вашему запросу. (проверено mssql 2008)
источник
count([uid])
, чтобы использовать егоcount(1)
?Один из способов решить эту проблему - отключить предупреждения.
SET ANSI_WARNINGS OFF; GO
источник
SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Использование
ISNULL(field, 0)
Его также можно использовать с агрегатами:Однако вы можете подумать об изменении
count(field) to count(*)
Редактировать:
пытаться:
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),
источник
ISNULL(count(field), 0)
у меня не работал в MSSQL 2008 R2. Проблема заключалась в том, что я пытался подсчитать поле в левой внешней объединенной таблице, чтобы получить количество записей в объединенной таблице, связанных с основной таблицей. В итоге мне пришлось сделать подзапрос, который объединил две таблицы, чтобы получить количество идентификаторов в основной таблице. Подзапрос остался внешним, присоединенным к основной таблице по идентификатору. Затем счетчик подзапроса был заключен в ISNULL, чтобы получить желаемый 0 (без предупреждения).Вы хотите поместить функцию
ISNULL
внутриCOUNT
, а не снаружи:Фигово:
ISNULL(COUNT(field), 0)
ХОРОШИЙ:
COUNT(ISNULL(field, 0))
источник
count(ISNULL(field, 0))
будет эквивалентноcount(*)
, поскольку подсчитываемое значение больше не может бытьNULL
.COUNT(ISNULL(field, 0))
который отличается отCOUNT(*)
, пожалуйста, сделайте это, SQL Fiddle позволяет легко поделиться таким контрпримером. Но у тебя не получится. ПосколькуCOUNT
подсчитывает ненулевые значения, даже если они равны нулю, иISNULL(field, 0)
всегда имеет ненулевое значение,COUNT(ISNULL(field, 0))
подсчитывает строки. Это тоCOUNT(*)
, для чего, а не то, что здесь было после OP.group by
запросе в другом контексте, чем то, что было после OP. В моем случаеISNULL(COUNT(field), 0)
возвращал бы счетчик 0 для всех значений NULL, который был неверным, поскольку было несколько значений NULL, тогда какCOUNT(ISNULL(field),0)
вернул бы правильный счет для общего # значений NULL. Но опять же, два совершенно разных сценария.Я получал эту ошибку; Я просто поместил
WHERE
предложение для поля, которое использовалось вcount
предложении. это решило проблему. Примечание: если существует нулевое значение, проверьте, является ли оно критичным для отчета, поскольку оно исключено из подсчета.Старый запрос:
select city, Count(Emp_ID) as Emp_Count from Emp_DB group by city
Новый запрос:
select city, Count(Emp_ID) as Emp_Count from Emp_DB where Emp_ID is not null group by city
источник
Если внутри агрегатной функции существует какое-либо значение 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
источник