복붙노트

[SQL] AVG가 null 또는 0 값을 무시 받기

SQL

AVG가 null 또는 0 값을 무시 받기

어떻게 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))

해결법

  1. ==============================

    1.당신이 NULL 0을 설정하는 NULLIF를 사용할 수 있도록 NULL 이미 무시됩니다. 또한 당신은 DISTINCT 필요가 없습니다하고 WHERE ActualTime에하는 스 SARGable하지 않습니다.

    당신이 NULL 0을 설정하는 NULLIF를 사용할 수 있도록 NULL 이미 무시됩니다. 또한 당신은 DISTINCT 필요가 없습니다하고 WHERE ActualTime에하는 스 SARGable하지 않습니다.

    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 나는 그렇게 내 대답에서 생략 한 조인 조건을 전혀 존재하는 한 원래의 질의에 무엇 표 2 B 모른다.

  2. ==============================

    2.이 비록 시도하지 않은, 작동합니다. 이 0이 제외됩니다. NULL은 기본적으로 제외

    이 비록 시도하지 않은, 작동합니다. 이 0이 제외됩니다. NULL은 기본적으로 제외

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

    3.'0'고려 또는 평균 함수 'NULL'하지 않는 경우. 간단하게 사용

    '0'고려 또는 평균 함수 'NULL'하지 않는 경우. 간단하게 사용

    AVG(NULLIF(your_column_name,0))
    
  4. ==============================

    4.나를 위해 일한 :

    나를 위해 일한 :

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

    5.이미 NOT NULL과 NULL 값을 필터링하는 시도합니다. 이 실행됩니다 그래서 WHERE 절에서 IS NOT NULL이 변경되었습니다. 우리는 AVG 방법에 ISNULL 함수를 제거하여이 리팩토링 할 수 있습니다. 또한, 우리는 캐스트를 제거 할 수 있도록 당신이 실제로 BIGINT가 필요합니다 의심.

    이미 NOT NULL과 NULL 값을 필터링하는 시도합니다. 이 실행됩니다 그래서 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
    
  6. from https://stackoverflow.com/questions/17425011/get-avg-ignoring-null-or-zero-values by cc-by-sa and MIT license