SQL Server

RANK()함수 널(NULL) 제외하고 카운팅하기

미스터몽키 2018. 3. 30. 18:31


다음과 같은 TEST 테이블에 자료가 있다고 하자.



이때 널 값을 제외하고 석차(랭킹)을 구하고 싶을 때 

다음과 같은 다양한 상황을 고려해야 한다.



1
2
3
4
5
6
7
8
9
10
 
SELECT ID, NAME, SCORE [성적], GRADE [등급],   
  RANK() OVER (ORDER BY SCORE ) [r1_오름_널도카운팅], 
  RANK() OVER (ORDER BY SCORE DESC) [r2_내림_널도카운팅], 
  CASE WHEN SCORE IS NULL THEN NULL ELSE RANK() OVER (ORDER BY SCORE ) END [r3_오름_문제됨],
  CASE WHEN SCORE IS NULL THEN NULL ELSE RANK() OVER (ORDER BY SCORE DESC) END [r4_내림_정상],
  CASE WHEN SCORE IS NULL THEN NULL ELSE RANK() OVER (ORDER BY CASE WHEN SCORE IS NULL THEN 1 ELSE 0 END, SCORE ) END [r5_오름_정상],
  CASE WHEN SCORE IS NULL THEN NULL ELSE RANK() OVER (ORDER BY CASE WHEN SCORE IS NULL THEN 1 ELSE 0 END, SCORE DESC) END [r6_내림_정상]
FROM TEST
ORDER BY ID
cs




오름차순 구문


OVER (ORDER BY CASE WHEN SCORE IS NULL THEN 1 ELSE 0 END, SCORE ) 


해석해 보면


SCORE 가 널일 경우 OVER(ORDER BY 1 ASC, SCORE)

널이 아닐 경우 OVER(ORDER BY 0 ASC, SCORE)


ASC 는 생략되어 있다.


결국 오름차순일 경우 널이 아닌 경우(0)가 먼저 나오고 널인 경우가 나중에 나온다.




마찬가지로 내림차순의 경우도


SCORE 가 널일 경우 OVER(ORDER BY 1 ASC, SCORE DESC)

널이 아닐 경우 OVER(ORDER BY 0,ASC, SCORE DESC)


로 해석되므로 널은 제외하고 카운팅된다.



오름차순은 꼭 위 사항을 고려해야한다. 널(NULL)이 아스키코드가 제일 빠르므로


내림차순의 경우는 OVER 절 안에 CASE 문은 없어도 된다.