오라클 - 테이블 옆으로 늘리고싶어!

지환·2023년 11월 29일
0

오라클

목록 보기
8/10
post-thumbnail

이렇게 늘리고 싶어 SELECT O,O,O,O,O,O,O 이런식으로 진행되겠지 하지만 밑에다가 붙이려면? 기존의 테이블이 아니야! 새로운 컬럼을 붙이고 싶은거야

DECODE SUM (더미객체) 패턴해야된다.

STEP1 - 더미객체를 만들어라


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

STEP2 - 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)

profile
아는만큼보인다.

0개의 댓글