경고 : Aqua Data Studio의 집계 또는 기타 SET 작업에 의해 Null 값이 제거되었습니다.


95

데이터가 null이고 결과가 표시 될 때 경고가 표시되면 문제가 있습니다. 이 문제를 해결하는 방법?. 테이블에 데이터가 없을 때 null 데이터를 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 에이전트에서 실행하는 저장 프로 시저가 필요합니다. 이렇게하면 경고로 인해 에이전트 작업이 실패합니다.
RichieACC 2015

이 질문은 말이되지 않습니다.
xr280xr

답변:


101

주로 COUNTUID를 요약하는 데 사용 합니다. 따라서

COUNT([uid]) 경고를 생성합니다.

경고 : 집계 또는 기타 SET 작업에 의해 Null 값이 제거되었습니다.

왼쪽 조인과 함께 사용되는 동안 계산 된 개체가 존재하지 않습니다.

COUNT(*)이 경우에 사용하면 존재하는 총 결과 (예 : 상위) 수를 계산하므로 잘못된 결과도 렌더링됩니다.

COUNT([uid])IS를 사용 하는 것은 유효한 계산 방법이며 경고는 경고 일뿐입니다. 그러나 염려하고이 경우에 uid의 실제 개수를 얻으려면 다음을 사용할 수 있습니다.

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

이것은 쿼리에 많은 오버 헤드를 추가하지 않습니다. (테스트 된 mssql 2008)


1
나는 그렇게 검색하고 성공하지 않고 시도했지만 ISNULL과 함께 NULLIF 결합을 사용하면 저를 구했습니다. 예를 들어 다음 두 가지 조합을 시도해 볼 수 있습니다. ISNULL (NULLIF ([fieldValue], 0), 1)
QMaster

"opencases"열에 대한 솔루션이 "select count (1) ..."(또는 다른 리터럴의 "count")만큼 간단하지 않습니까? Where 절은 이미 "및 closed is NULL"을 지정하므로이 인스턴스에서 case 문을 합산 할 필요가 없습니다. 또한 "count (*)"가 단일 열이나 리터럴을 계산하는 것만 큼 효율적이지는 않지만 여전히 사실인지 확실하지 않다고 들었습니다.
RowanPD

대신 count([uid])사용하는 것이 작동 count(1)합니까?
Farhan

@Mat Traherne 선생님이 저를 구했습니다 :) Excel 파일에서 데이터를 연결하려고 시도했지만 이미 ISNULL (x, y)가 있지만 작동하지 않았지만 "SUM (CASE WHEN X IS NULL THEN 0 ELSE X END) AS Z "가 훌륭하게 작동했습니다! 감사!
Dimitri

20

이 문제를 해결하는 한 가지 방법은 경고를 끄는 것입니다.

SET ANSI_WARNINGS OFF;
GO

30
에서 MSDN , 이것은 단지 집계에서 널 (null)에 대해 경고를 변경하지 않습니다, 또한 제로 오버 플로우 오류로 분할의 처리를 수정합니다. 이로 인해이 솔루션이 "안돼"가됩니다.
Frédéric

3
어쨌든 그것을 문제로 여기는 이유는 무엇입니까? 그것은 단지 정보 제공
마틴 스미스

2
@Mukus-아니에요. 심각도 레벨 10에서 메시지를 인쇄합니다. 10 이하는 정보 용이며 오류로 간주되지 않습니다. SELECT SUM(X) FROM (VALUES ( 1 + NULL)) V(X);SELECT 'This is executed fine';
Martin Smith

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)은 여전히 ​​행에 존재합니다. 데이터가 null 일 때이 값을 0으로 변경하는 방법은 무엇입니까?
Amin SCO

감사합니다. 그러나 null이 나타날 때 null이 아닌 값도 같은 문제가 발생합니다. 값을 0으로 변경하는 방법?.
Amin SCO

1
참고 : ISNULL(count(field), 0)MSSQL 2008 R2에서는 작동하지 않았습니다. 문제는 기본 테이블과 관련된 조인 테이블의 레코드 수를 가져 오기 위해 왼쪽 외부 조인 테이블의 필드를 계산하려고했기 때문입니다. 결국 메인 테이블의 ID 당 개수를 얻기 위해 두 테이블을 내부 조인하는 하위 쿼리를 만들어야했습니다. 하위 쿼리는 ID의 기본 테이블에 외부 조인 된 상태로 남아 있습니다. 그런 다음 하위 쿼리의 개수를 ISNULL로 래핑하여 경고 메시지없이 원하는 0을 얻었습니다.
2008

1
Chris, COUNT (ISNULL (Field, 0))이어야합니다. 현재 형식을 쿼리하면 반환 될 모든 것은 실제 개수가 아닌 0입니다. 논리 : Count (field)는 null 인 모든 필드 값에 대해 단일 NULL을 반환하고 ISNULL은이를 0으로 설정하여 0을 반환합니다.
Govind Rai

9

외부가 아닌 함수 ISNULL내부에 넣기를 원합니다 COUNT.

안좋다: ISNULL(COUNT(field), 0)

좋은: COUNT(ISNULL(field, 0))


12
이것은 잘못되었습니다. count(ISNULL(field, 0))에 해당 될 것입니다 count(*)더 이상 적이 될 수 계산되는 값으로, NULL.

@hvd 그것은 틀리지 않습니다. 필드가 null 일 때 값은 0입니다.
Govind Rai

3
@GovindRai 아니요, 정말 잘못되었습니다. 당신이 반례를 생각해 낼 수 있다고 믿는다면,와 COUNT(ISNULL(field, 0))다른 예를 들어 COUNT(*)주세요. SQL Fiddle 은 그러한 반례를 쉽게 공유 할 수 있도록합니다. 그러나 당신은 할 수 없습니다. 이후 COUNT카운트 null 이외의 값은 0이, 그리고 경우에도 ISNULL(field, 0)항상 null이 아닌 값이며, COUNT(ISNULL(field, 0))카운트 행. 그것이 바로 COUNT(*)여기의 OP가 아닌 이유입니다.

2
@hvd 맞아요. 내 대답은 group byOP가 추구했던 것과 다른 맥락 의 쿼리를 기반으로했습니다 . 내 경우 ISNULL(COUNT(field), 0)에는 여러 개의 null 값이 있기 때문에 잘못된 모든 NULL 값에 대해 0의 개수를 반환하는 반면 COUNT(ISNULL(field),0)NULL 값의 총 개수에 대한 올바른 개수를 반환합니다. 그러나 다시 두 가지 완전히 다른 시나리오입니다.
빈드 라이

작동합니다. 여기 있습니다! sqlfiddle.com/#!3/ee0546/2 Upvoted 귀하의 코멘트의 롤
빈드 라이

-2

이 오류가 발생했습니다. WHERE내에서 사용 된 필드 에 대한 절을 넣었습니다.count . 문제가 해결되었습니다. 참고 : null 값이있는 경우 개수에서 제외되므로 보고서에 대한 중요 여부를 확인하십시오.

이전 쿼리 :

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.