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


95

当数据为空并且显示结果时出现警告,我遇到了问题。如何解决这个问题呢?。当表中没有数据时,如何将空数据更改为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(closed) ... WHERE ... closed IS NULL没有意义,因为COUNT只计算NOT NULL价值
马丁·史密斯


我收到同样的警告。我不介意警告本身,但是我需要存储过程由SQL Agent运行,并且当我这样做时,警告会导致Agent作业失败。
RichieACC 2015年

这个问题没有道理。
xr280xr

Answers:


101

您通常会使用COUNTUID进行汇总。因此

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

警告:通过合计或其他SET操作消除了空值。

与左联接一起使用时,其中不存在被计数的对象。

COUNT(*)在这种情况下使用也会导致不正确的结果,因为您将要计算存在的结果总数(即父母)。

使用COUNT([uid])IS是一种有效的计数方式,而警告仅是警告。但是,如果您担心这种情况下想要获得真正的uid计数,则可以使用:

SUM(CASE WHEN [uid] IS NULL THEN 0 ELSE 1 END) AS [new_count]

这不会为您的查询增加很多开销。(已测试mssql 2008)


1
我这样搜索并尝试失败,但是将NULLIF与ISNULL结合使用救了我,例如,您可以尝试将两者结合使用:ISNULL(NULLIF([fieldValue],0),1)
QMaster

专门针对“ opencases”列的解决方案不会像“ select count(1)...”(或任何其他文字的“ count”)那样简单吗?Where子句已经指定“并且closed为NULL”,因此在此实例中无需对case语句求和。另外,我(以前)还听说过“ count(*)”不如计算单个列或文字的效率高,但不确定是否仍然如此。
RowanPD

相反count([uid]),使用它会起作用count(1)吗?
Farhan

您长官,@ Mat Traherne先生救了我:)我得到了这个尝试在Excel文件中连接数据的方法,该文件已经具有ISNULL(x,y)了,但是没有用,但是“ SUM(当X为NULL时,则为0,否则为X END)AS Z“很棒!谢谢!
Dimitri

19

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

SET ANSI_WARNINGS OFF;
GO

30
msdn来看,这不仅会更改有关聚合中null的警告,而且还会修改除零和溢出错误的处理。这导致该解决方案对我来说是“不行”。
弗雷德里克

3
您为什么仍然认为它是一个问题?这只是提供信息
Martin Smith

2
@Mukus-不,不是。它以严重性级别10打印出一条消息。10或更低的任何信息都不会被视为错误。SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
马丁·史密斯

5
@RichieACC是的,因为这不是答案,并且禁用非常理想的ANSI警告作为一种避免一条信息性消息的懒惰方式,会导致其他许多明显非信息性的内容损坏。
underscore_d

3
解决您的汽车警示灯点亮的方法是拔掉仪表板的插头。这可能是我在stackoverflow上见过的最糟糕的答案。
VoronoiPotato

17

用途ISNULL(field, 0)还可以与聚集体一起使用:

ISNULL(count(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),

我尝试过,但(null)仍然存在于行中。数据为空时如何将此值更改为0?
Amin SCO

谢谢,但是当出现null时,非null值也遇到相同的问题。如何将值更改为0?
Amin SCO

1
仅供参考:ISNULL(count(field), 0)在MSSQL 2008 R2中对我不起作用。问题是因为我试图对左外部联接表中的字段进行计数,以获取联接表中与主表相关的记录数。我最终不得不进行一个子查询,该查询将两个表内部连接在一起,以获取主表中每个ID的计数。子查询从外部连接到ID上的主表。然后,将子查询的计数包装在ISNULL中,以得到我想要的0(没有警告消息)。
2012年

1
克里斯,应该是COUNT(ISNULL(Field,0)),而不是相反。查询当前格式,将返回的所有内容均为0,而不是实际计数。逻辑:计数(场)将返回一个NULL对于那些空和ISNULL将设置为0的所有字段值,则返回0。
戈文德拉伊

9

您想将函数放在ISNULL内部COUNT,而不是外部:

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

好: COUNT(ISNULL(field, 0))


12
错了 count(ISNULL(field, 0))等于count(*),因为被计数的值不再是NULL

@hvd没错,当字段为null时,该值仅为0。
Govind Rai'3

3
@GovindRai不,这确实是错误的。如果您认为可以提出反例(与实例COUNT(ISNULL(field, 0))不同)COUNT(*),请这样做,SQL Fiddle使共享此类反例变得容易。但是您将无法。由于COUNT即使非零值也为零,ISNULL(field, 0)也对非空值进行COUNT(ISNULL(field, 0))计数,并且始终为非空值,因此对行进行计数。那COUNT(*)是为了什么,而不是这里的OP之后的目的。

2
@hvd你是对的。我的答案基于group by与OP所处环境不同的查询。在我的情况下,ISNULL(COUNT(field), 0)将为所有NULL值返回0计数,这是不正确的,因为存在多个null值,而COUNT(ISNULL(field),0)对于正确的NULL值总数将返回正确的计数。但是同样,两种完全不同的方案。
Govind Rai

得到它的工作。干得好!sqlfiddle.com/#!3/ee0546/2提出了您的评论大声笑
Govind Rai

-2

我收到此错误;我只是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

-3

如果聚合函数中存在任何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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.