[Oracle] group by, having + 분석함수

이정민·2022년 3월 15일
0

nvl(컬럼명, 0) -> 그 컬럼에서 null값이 있으면 0으로 대체

lag() over() -> 한 세트로 분석함수 lag()는 이전 행의 값을 순차적으로 넣어준다.

group by 칼럼을 묶어서 보기 편하게 해준다.
having 은 group by에서 조건 줄 때 사용 grouping과도 같이 사용


SELECT max(decode(NO,1,name)) name
	  ,max(decode(NO,1,kor)) kor
	  ,max(decode(NO,1,eng)) eng
	  ,max(decode(NO,1,mat)) mat
	  ,max(decode(NO,1,s_sum)) s_sum
	  ,nvl(min(decode(NO,2,s_sum)) - min(decode(NO,1,s_sum)),0) cha2
from(
SELECT name
	  ,NO
	  ,rownum num
	  ,decode(NO,2,rownum-4,rownum) no_1
	  ,kor
	  ,eng
	  ,mat
	  ,s_sum
	  ,decode(NO,1,s_sum) one_sum
	  ,decode(NO,2,s_sum) two_sum
from
(SELECT name
	   ,kor
	   ,eng
	   ,mat
	   ,floor((kor+eng+mat)/3) s_sum
FROM LJM_EXAM
ORDER BY s_sum desc) a, no_table b
WHERE NO <=2)
GROUP BY no_1
HAVING max(decode(NO,1,name)) IS NOT null
ORDER BY s_sum DESC, cha2 desc;

조인한 no_table은 칼럼이름이 no, 로우는 2개 있는 번호가 순서대로 1번부터 2번까지 있는 테이블을 따로 만들어서 무조건 조인했다.

이번이 2번째 임에도..(1시간 30분정도 걸림...)
결과


.
.
분석함수를 이용한 쿼리(훨씬 간단해졌다) (3~5분만에 해결)

lag() over() -> 한 세트로 분석함수 lag()는 이전 행의 값을 순차적으로 넣어준다.

lag(floor((kor+eng+mat)/3)) over(....) s_cha
s_sum행의 위아래 차를 s_cha에 나타내준다.


SELECT name
	  ,kor
	  ,eng
	  ,mat
	  ,floor((kor+eng+mat)/3) s_sum
	  ,nvl(lag(floor((kor+eng+mat)/3)) over(ORDER BY floor((kor+eng+mat)/3) desc) - floor((kor+eng+mat)/3),0) s_cha
FROM LJM_EXAM;

profile
안녕하세요.

0개의 댓글