최고점수 구하기 2

by 홍2 [Oracle 기초] [2022.09.05 18:05:33]


SELECT NM
		,SUBSTR(MAX(LPAD(SCORE,3,'0')||SUBJECT),4) SUBJECT
		,MAX(SCORE) SCORE
FROM STD_SCORE
GROUP BY NM

위 코드를 사용하여 최고 점수를 가진 SUBJECT를 추출했는데 

LPAD부터 ,4 까지의 의미를 모르겠습니다.. ㅜ 

왜 LPAD를 사용하여 어떻게 나오게 된 것일지 궁금합니다!!

by 마농 [2022.09.05 22:05:53]

학생별(GROUP BY nm) 최고점수(MAX(score))를 구하는 쿼리인데
여기에 최고점수에 해당하는 과목을 함께 출력하기 위해서는
분석함수 사용 가능한 버전이라면? 분석함수를 사용하거나
분석함수 사용 불가능한 버전이라면? 서브쿼리나 셀프조인 등의 복잡한 방법을 사용해야 하는데
이런 복잡함을 피하기 위해서 간결하게 사용할 수 있는 일종의 팁입니다.
분석함수가 사용가능한 버전에서는 보통 분석함수를 이용해 구하게 됩니다.

점수는 3자리 미만(100점 만점)이라 가정하고
LPAD 를 이용해 점수를 3자리로 맞춰줍니다.(예 : 90 -> '090')
문자 연결 연산자(||)를 이용해 과목을 붙여줍니다.
예를 들면 (수학, 100점) (국어, 90점) 자료가 있을 경우
LPAD(score, 3, '0') || subject) 의 결과는
(100수학) 과 (090국어) 가 나오게 되고
이 중 MAX 는 '100수학' 이 됩니다.
4번째 자리부터 자르면 앞 3자리 100 이 잘려서 수학만 남게 되는 원리입니다.

LPAD 를 사용하는 이유는?
만약 LPAD 를 사용하지 않게 되면. 
(score || subject) 의 결과는
(100수학) 과 (90국어) 가 나오게 되고
이 중 MAX 는 '90국어' 가 됩니다.
잘못된 결과가 나오게 되고 몇번째 자리에서 잘라야 할지도 모호해 집니다.

다만, 이 방법의 문제점은
최고 점수가 동점인 과목이 2건 이상인 경우
과목명이 큰 값 하나만 출력된다는 문제점이 있습니다.
(수학, 100점) (국어, 100점) 인 경우 (수학)만 출력됨


by 홍2 [2022.09.05 22:13:21]

와!! 감사합니다!!!

 

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