警告:Aqua Data Studio中的聚合或其他SET操作消除了空值

Ami*_*SCO 89 sql sql-server-2005

数据为空时出现问题,显示结果时出现警告.如何解决这个问题呢?.如果表中没有数据,如何将空数据更改为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 
Run Code Online (Sandbox Code Playgroud)

结果如下: -

 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)     
Run Code Online (Sandbox Code Playgroud)

小智 95

您将主要COUNT用于总结UID.因此

COUNT([uid]) 会产生警告:

警告:聚合或其他SET操作消除了空值.

与左连接一起使用时,计数对象不存在.

COUNT(*)在这种情况下使用也会产生不正确的结果,因为您将计算存在的结果总数(即父项).

使用COUNT([uid])IS是一种有效的计数方式,警告只不过是一个警告.但是,如果你担心,并且你想在这种情况下得到真正的uid数,那么你可以使用:

SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]
Run Code Online (Sandbox Code Playgroud)

这不会给查询增加很多开销.(经过测试的mssql 2008)


Muk*_*kus 20

解决此问题的一种方法是关闭警告.

SET ANSI_WARNINGS OFF;
GO
Run Code Online (Sandbox Code Playgroud)

  • 从[msdn](https://msdn.microsoft.com/en-us/library/ms190368.aspx),这不仅会更改聚合中有关null的警告,还会修改除以零和溢出错误的处理.这导致这个解决方案对我来说是"不行". (26认同)
  • @RichieACC是的,因为这不是一个答案,并且禁用极其理想的ANSI警告作为避免一条信息性消息的懒惰方式将导致许多其他非信息性事物的破坏. (4认同)
  • 为什么你认为这是一个问题?[这只是信息](http://stackoverflow.com/a/18719852/73226) (3认同)
  • @Mukus - 不,不.它在严重级别10打印出一条消息.任何10或更低的信息都不会被视为错误信息.`SELECT SUM(X)FROM(VALUES(1 + NULL))V(X); SELECT'执行正常';` (2认同)
  • 当我关闭ANSI警告时,出现以下错误,这对我来说不是解决方案。“异构查询要求为连接设置ANSI_NULLS和ANSI_WARNINGS选项。这确保了查询语义的一致性。启用这些选项,然后重新发出查询。” (2认同)
  • 解决您的汽车警告灯点亮的方法是拔下仪表板。这可能是我在stackoverflow上见过的最糟糕的答案。 (2认同)

Chr*_*ler 17

使用ISNULL(field, 0)它也可以与聚合一起使用:

ISNULL(count(field), 0)
Run Code Online (Sandbox Code Playgroud)

但是,您可以考虑更改 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),
Run Code Online (Sandbox Code Playgroud)


小智 7

你想把函数的ISNULL内部COUNT,而不是外部:

不好: ISNULL(COUNT(field), 0)

好: COUNT(ISNULL(field, 0))

  • 这是错的.`count(ISNULL(field,0))`将等同于`count(*)`,因为正在计数的值不再是'NULL`. (12认同)
  • @GovindRai不,这确实是错的.如果您认为可以提出一个反例,例如`COUNT(ISNULL(field,0))`与`COUNT(*)`不同,请执行此操作,[SQL Fiddle](http:// www. sqlfiddle.com/)可以轻松分享这样的反例.但你无法做到.由于`COUNT`计数非空值,即使它们为零,并且`ISNULL(field,0)`总是非空值,`COUNT(ISNULL(field,0))`计数行.这就是`COUNT(*)`的用途,而不是之后的OP. (3认同)
  • @hvd你是对的.我的答案是基于一个"分组依据"查询,该查询与OP所处的不同.在我的情况下,`ISNULL(COUNT(field),0)`将为所有NULL值返回0的计数,因为有多个空值而不正确,而`COUNT(ISNULL(field),0)`将返回正确的计算NULL值的总数.但同样,两个完全不同的场景. (2认同)