[SQL] AVG가 null 또는 0 값을 무시 받기
SQLAVG가 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.당신이 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.이 비록 시도하지 않은, 작동합니다. 이 0이 제외됩니다. NULL은 기본적으로 제외
이 비록 시도하지 않은, 작동합니다. 이 0이 제외됩니다. NULL은 기본적으로 제외
AVG (CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
-
==============================
3.'0'고려 또는 평균 함수 'NULL'하지 않는 경우. 간단하게 사용
'0'고려 또는 평균 함수 'NULL'하지 않는 경우. 간단하게 사용
AVG(NULLIF(your_column_name,0))
-
==============================
4.나를 위해 일한 :
나를 위해 일한 :
AVG(CASE WHEN SecurityW <> 0 THEN SecurityW ELSE NULL END)
-
==============================
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
from https://stackoverflow.com/questions/17425011/get-avg-ignoring-null-or-zero-values by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 감사 테이블을 구현하기위한 제안? (0) | 2020.05.22 |
---|---|
[SQL] 날짜 조건을 선택 SQLite는 (0) | 2020.05.22 |
[SQL] 나는 PRIMARY KEY로 VARCHAR를 사용할 수 있습니까? (0) | 2020.05.22 |
[SQL] 지난 7 일을 선택 MYSQL (0) | 2020.05.22 |
[SQL] 지수 (기반 영)보다 커야 제로에 동일해야합니다 (0) | 2020.05.22 |