이렇게 늘리고 싶어 SELECT O,O,O,O,O,O,O 이런식으로 진행되겠지 하지만 밑에다가 붙이려면? 기존의 테이블이 아니야! 새로운 컬럼을 붙이고 싶은거야
DECODE SUM (더미객체) 패턴해야된다.
SELECT rno, emp_name
FROM (SELECT rownum rno, emp_name from temp)
이렇게 만들면 위 결과랑 똑같이 나온다.
우리는 곱하기를 해야돼 테이블 자체를 옆으로 2개를 만들고 싶으면 2배 하면 되고
3개를 만들고 싶으면 3배 하면 돼 뭐를? rownum을
SELECT a.rno
FROM temp,(SELECT rownum rno, emp_name from temp where rownum < 3)a
이렇게 작성하면 컬럼은 카타시안의 곱이 걸리게 되어 40개가 형성이 된다. 똑같은 테이블에 대해서
2번 반복한다는 얘기다. 꼭 알고 있어야 한다.
이렇게 된다면, 문제점이 하나 발생한다 굳이 더미노드를 왜 쓰죠?
2배 하는건 오히려 복잡도가 떨어지는 일이잖아요 - 맞말 이 부분에 대해서 어떻게 줄일 수 있을까?
밑에다가 총계랑 소계를 어떻게 밑에다 붙일 수 있을까? 에 대해서도 생각해야된다.
1. 목표 : 중복제거 DECODE 그렇다면 조건을 어떻게 부여할껀데? a.rno를 쓰는 이유, emp_name 왜 있어?
우리가 출력하고 싶은 건 뭐야? 지금은 이름이야 조건을 걸고 -> true (emp_name) 출력하면 된다. 그래서 필요하다
근데 인라인뷰에다 했다. 끌어다 쓸 수 있으니깐
SELECT DECODE(a.rno,1,emp_name)
FROM temp,(SELECT rownum rno, emp_name from temp where rownum < 3)a;
그러면 1 = a.rno 두 개가 같을 떄 emp_name을 출력한다.(첫번쨰에)
SELECT DECODE(a.rno,2,emp_name)
FROM temp,(SELECT rownum rno, emp_name from temp where rownum < 3)a;
이렇게 쓴다면 2가 나온다. 2자리에 emp_name이 들어간다. 2라는 것은
rownum의 2번쨰 로우를 나타낸다.
1번은 ? 0-19
2번은 ? 20~40이 = 2번이라는 얘기다.
위처럼 쓰게 된다면 우리는 1의 경우에 2번 자리는 null값을 갖고
2의 경우에 1번 자리는 null값을 갖는다. 이걸 어떻게 해결할래?
======================================================================
SELECT DECODE(a.rno,1,a.emp_name,2,'총계')
FROM temp,(SELECT rownum rno, emp_name from temp where rownum < 3)a
이렇게 쓴다면,
0~19 : a.emp_name이 들어가고
20~40 : '총계' 가 들어간다.
만약에 더미노드가 2개라면?
이런 논리다.
근데 문제에서는 ceil이라는 함수를 이용해서 표현한다. mod
SELECT ceil(rno/3) cno
FROM (
SELECT rownum rno, emp_name FROM temp
)
- Ceil은 어떤역할을 할까? ceil은 번호를 전체 나타낸다.
111 / 222/ 333 ~ / 777--> 총(20)
STEP2 - MOD함수를 이용한다.
SELECT ceil(rno/3) cno,
DECODE(MOD(rno,3),2,emp_name)
,DECODE(MOD(rno,3),1,emp_name)
,DECODE(MOD(rno,3),0,emp_name)
FROM (
SELECT rownum rno, emp_name FROM temp
)
[답]
SELECT ceil(rno/3) cno,
max(DECODE(MOD(rno,3),2,emp_name))
,max(DECODE(MOD(rno,3),1,emp_name))
,max(DECODE(MOD(rno,3),0,emp_name))
FROM (
SELECT rownum rno, emp_name FROM temp
)
GROUP BY ceil(rno/3)
ORDER BY ceil(rno/3)