Предупреждение: значение 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