2013-07-02 1 views
22

열의 AVGNULL 및 0 값을 무시하는 방법은 무엇입니까?Null 또는 Zero 값을 무시하는 AVG 가져 오기

내가 평균을 얻기 위해 세 개의 열을 가지고, 나는 다음과 같은 스크립트를 사용하려고 :

SELECT distinct 
    AVG(cast(ISNULL(a.SecurityW,0) as bigint)) as Average1 
    ,AVG(cast(ISNULL(a.TransferW,0) as bigint)) as Average2 
    ,AVG(cast(ISNULL(a.StaffW,0) as bigint)) as Average3 
FROM Table1 a, Table2 b 
WHERE a.SecurityW <> 0 AND a.SecurityW IS NOT NULL 
AND a.TransferW<> 0 AND a.TransferWIS NOT NULL 
AND a.StaffW<> 0 AND a.StaffWIS NOT NULL 
AND MONTH(a.ActualTime) = 4 
AND YEAR(a.ActualTime) = 2013 

내가 어떤 결과를 얻을하지 않습니다, 그러나 세 개의 열이 NULL과 0을 포함한 값이!

평균을 얻기 전에 null 값을 제외 할 수 있습니까?

예 : AVERAGE(NOTNULL(SecurityW))

+1

그 모든'AND's는 만 3 열에서 NULL이 아닌 값을 갖는 행을 얻을 것이다 것을 의미 사용할 수 있습니다. 또한,'Column'>'NULL' 인 경우'Column <> 0'은'UNKNOWN'으로 평가되므로 NOT NULL 검사는 필요하지 않습니다. –

답변

1

이미 NOT NULLNULL 값을 필터링하는 시도합니다. WHERE 절의 IS NOT NULL으로 변경하여 실행합니다. AVG 메서드에서 ISNULL 함수를 제거하여 리팩터링 할 수 있습니다. 또한 캐스팅을 제거 할 수 있도록 실제로 bigint이 필요하다고 생각됩니다.

SELECT distinct 
    AVG(a.SecurityW) as Average1 
    ,AVG(a.TransferW) as Average2 
    ,AVG(a.StaffW) as Average3 
FROM Table1 a, Table2 b 
WHERE a.SecurityW <> 0 AND a.SecurityW IS NOT NULL 
AND a.TransferW<> 0 AND a.TransferWIS IS NOT NULL 
AND a.StaffW<> 0 AND a.StaffWIS IS NOT NULL 
AND MONTH(a.ActualTime) = 4 
AND YEAR(a.ActualTime) = 2013 
7

이 작업은 시도해 보지 않았습니다. 0이 제외됩니다. NULL은 당신이 NULL0을 설정하는 NULLIF을 사용할 수 있도록

AVG (CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END) 
43

NULL 이미 무시 기본적으로 제외됩니다. 또한 DISTINCT이 필요없고 에 WHERE을 입력 할 수 없습니다.

SELECT AVG(cast(NULLIF(a.SecurityW, 0) AS BIGINT)) AS Average1, 
     AVG(cast(NULLIF(a.TransferW, 0) AS BIGINT)) AS Average2, 
     AVG(cast(NULLIF(a.StaffW, 0) AS BIGINT)) AS Average3 
FROM Table1 a 
WHERE a.ActualTime >= '20130401' 
     AND a.ActualTime < '20130501' 

PS 나는 그렇게 내 대답에서 생략 한 조인 조건을 전혀 존재하는 한 원래의 질의에 무엇 Table2 b 모른다.

+0

btw 정수를 bigint로 변환하면 아무 것도 생각하지 않는다. –

+5

@ t-clausen.dk - 'SUM'이 너무 크면 산술 오버플로 오류를 방지 할 수있다. SELECT (SELECT 2147483647 UNION ALL SELECT 2147483647) T (C)'는 실패하지만'SELECT AVG (CAST (C AS BIGINT)) FROM (SELECT 2147483647 UNION ALL SELECT 2147483647) T (C)'성공합니다. –

+0

귀하의 요점을 참조하십시오 –

2

은 나를 위해 일한 :

AVG(CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END) 
0

를 케이스에서 고려 '0'또는 평균 함수 'NULL'하지의. 간단히

AVG(NULLIF(your_column_name,0)) 
관련 문제