2011-03-08 6 views
1

5 개의 "선택 사항"필드가있는 테이블이 있습니다. 나는 얼마나 많은 모두 5 널 (null)을 얼마나 많은 행을 찾을 싶습니다 내가 좋아하는, 몇 가지를 시도했습니다oracle : 행의 null 필드 개수 계산

등 null 이외의 1 개 필드 :

select 
count(*), 
((if field1 is null then 1 else 0) + 
    (if field2 is null then 1 else 0) + 
etc. 

만의 물론 작동하지 않는 코스.

적으로는, 내가 출력을 찾고 있다는

Nulls Cnt 
0  200 
1  345 
... 
5  40 

같은 우아한 해결책이 있습니까?

답변

2

키워드가 if이 아니고 case이고 case 문을 끝내려면 end을 사용해야합니다. 여기

당신을 맞게 할 수있는 쿼리입니다 :

WITH subQuery AS 
(
    SELECT My_Table.*, (CASE WHEN My_Table.field1 IS NULL THEN 1 ELSE 0 END + 
         CASE WHEN My_Table.field2 IS NULL THEN 1 ELSE 0 END + 
         CASE WHEN My_Table.field3 IS NULL THEN 1 ELSE 0 END + 
         CASE WHEN My_Table.field4 IS NULL THEN 1 ELSE 0 END + 
         CASE WHEN My_Table.field5 IS NULL THEN 1 ELSE 0 END) NumberOfNullFields 
    FROM My_Table 
) 
SELECT NumberOfNullFields, COUNT(*) 
    FROM subQuery 
GROUP BY NumberOfNullFields; 
1

계산 때, 난 그냥 다른 방법이 있다면보고 싶어 경우 아무 문제가 없지만.

WITH SAMPLEDATA AS(--just generate some data with nulls for 5 cols 
    select level , 
      (case when mod(level,2) = 0 then 1 else null end) colA, 
      (case when mod(level,3) = 0 then 1 else null end) colB, 
      (case when mod(level,5) = 0 then 1 else null end) colC, 
      (case when mod(level,7) = 0 then 1 else null end) colD, 
      (case when mod(level,11) = 0 then 1 else null end) colE 

     from dual 
     connect by level < 1000 
    ), --utilize the count(Aggregate)'s avoidance of nulls to our summation advantage 
    nullCols as(
    SELECT COUNT(COLA) aNotNull 
      ,cOUNT(*)-COUNT(COLA) aNull 
      ,count(colB) bNotNull 
      ,cOUNT(*)-count(colB) bNull 
      ,count(colc) cNotNull 
      ,cOUNT(*)-count(colc) cNull 
      ,count(cold) dNotNull 
      ,cOUNT(*)-count(cold) dNull 
      ,count(cole) eNotNull 
      ,cOUNT(*)-count(cole) eNull 
      , cOUNT(*) TotalCountOfRows 
    from SAMPLEDATA ) 
    SELECT (select count(*) from sampledata where cola is null and colb is null and colc is null and cold is null and cole is null) allIsNull  
      ,nullCols.* 
    FROM nullCols; 

ALLISNULL    ANOTNULL    ANULL     BNOTNULL    BNULL     CNOTNULL    CNULL     DNOTNULL    DNULL     ENOTNULL    ENULL     TOTALCOUNTOFROWS  
---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- ---------------------- 
207     499     500     333     666     199     800     142     857     90      909     999      

이것은

카운트 (식) 발현 null로 평가되면

, 이는 계산되지 않은을 이용한다 : here

이 방법에서 언급 된 바와 같이, 알 수있는 바와 같이 위에서 언급 한 것처럼 모든 널 열을 '능변 적으로'합하지 않습니다. CASE 로직없이 이것이 가능한지 알고 싶었습니다.