경고 : 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.