RANK 함수 질문 드립니다.. 0 8 2,283

by 낭만캐치 [2014.10.07 14:06:41]


안녕하세요

RANK 함수를 이용하여 0원인 애들은 등수에서 빼고 1원인 녀석부터 등수를 매기고 싶은데요

SELECT STD_YYMM As StdYyMm

             , BIZNO AS BizNo

       , CASE WHEN AMT2 > 0 THEN RANK() OVER(PARTITON BY STD_YYMM ORDER BY AMT2) ELSE 0 END AS RNK

where STD_YYMM = '201410'

---------------------------------------

이렇게 했을때의 총건수 100건.

AND AMT2 > 0   <------------이렇게하면 0원이 빠지긴 하는데 15건 ,

0원인애들을 보존하고싶거든요.

어떻게해야할까요?

읽어주셔서 감사합니다

 

by 아발란체 [2014.10.07 14:21:17]

CASE문 else 구문에 의해 amt2 값이 0원인것도 0으로 출력되고 있습니다.

말씀 하신 0원인 데이타도 보존하고 싶다고 말씀하신 것이 어떻게 해야 보전하는 것인지 명확한 단서가 필요해보입니다.


by DarkBee [2014.10.07 14:23:24]
, CASE WHEN AMT2 > 0 THEN RANK() OVER(PARTITON BY STD_YYMM ORDER BY AMT2) ELSE 0 END AS RNK

==>

, RANK() OVER(PARTITON BY STD_YYMM ORDER BY DECODE ( AMT2, 0, 999999 )) AS RNK

 


by jkson [2014.10.07 14:26:48]

결과는 100건으로 나오고 rnk에는 amt2가 0이 아닌 것들로 순위를 매긴다는 말인가요? amt2가 0이면 rnk는 0이구요?


by 낭만캐치 [2014.10.07 14:32:40]

가장 적은값이 2200원이라고 했을 때, 0원인 녀석들때문에

85등부터 시작하거든요

0원인 녀석은 RANK에 포함되지않고

2200원 녀석이 1등

2300원이 2등  . . . . .

0원인 녀석들은 꼴등으로 하고싶습니다..


by jkson [2014.10.07 14:36:22]

그러면 DarkBee님 쿼리 참조하시면 될 것 같아요. 쿼리를 살짝 빠트리신 것 같은데 DECODE ( AMT2, 0, 999999, AMT2 )) 으로 바꿔서 하시면 될 것 같군요.


by 아발란체 [2014.10.07 14:37:51]
--다크비님 것과 동일하며, 오라클은 NULL을 정렬 시 뒤로 조회 됩니다.
--명시적 선언 시 ORDER BY 구문에 NULLS LAST를 넣어도 됩니다.
WITH T AS (
  SELECT 1 val FROM DUAL UNION ALL
  SELECT 2 val FROM DUAL UNION ALL
  SELECT 3 val FROM DUAL UNION ALL
  SELECT 0 val FROM DUAL UNION ALL
  SELECT 0 val FROM DUAL 
)
SELECT val, RANK() OVER(ORDER BY DECODE(val, 0, NULL, val)) FROM T 

 


by 낭만캐치 [2014.10.07 14:55:49]

답글을 달아주신 DarkBee님 jkson님 아발란체님

감사합니다! 덕분에 해결하였습니다. 또 하나 알아가네요..

답변채택은 DarkBee님으로 클릭해야하는데 잘못클릭했네요..^^;;

즐거운 하루보내세요..^^


by DarkBee [2014.10.07 15:32:13]

아 네 빠졌네요 ㅠ

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입