programing

Null 또는 0 값을 무시하는 AVG 가져오기

newsource 2023. 7. 29. 08:31

Null 또는 0 값을 무시하는 AVG 가져오기

어떻게 하면 얻을 수 있습니까?AVG무시하는 열의NULL그리고 0 값?

평균을 얻기 위해 세 개의 열이 있습니다. 다음 스크립트를 사용하려고 합니다.

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))

NULL이미 무시되었으므로 를 사용할 수 있습니다.NULLIF방향을 틀다0로.NULL또한 당신은 필요하지 않습니다.DISTINCT그리고 당신의WHEREActualTime인수할 수 없습니다.

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을 제외합니다.NULL은 기본적으로 제외됩니다.

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

평균 함수에서 '0' 또는 'NULL'을 고려하지 않은 경우.간단히 사용

AVG(NULLIF(your_column_name,0))

저를 위해 일했습니다.

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

이미 필터링을 시도하고 있습니다.NULL와의 가치.NOT NULL로 변경했습니다.IS NOT NULL에서WHERE실행할 절입니다.우리는 이것을 제거함으로써 리팩터링할 수 있습니다.ISNULL에서 기능하는.AVG방법.또한, 당신이 정말로 필요로 할 것 같지는 않습니다.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

null 값은 평균 계산에서 제외됩니다.0 값도 제외해야 하는 경우에는 avg 함수 안에서 디코드 함수를 사용하면 됩니다.

SELECT AVG(decode(a.SecurityW,0,null,a.SecurityW)) as Average1
 ,AVG(decode(a.TransferW,0,null,a.TransferW)) as Average2
 ,AVG(decode(a.StaffW,0,null,a.StaffW)) as Average3 
FROM Table1 a,  Table2 b
WHERE MONTH(a.ActualTime) = 4
AND YEAR(a.ActualTime) = 2013;

언급URL : https://stackoverflow.com/questions/17425011/get-avg-ignoring-null-or-zero-values