DB 과제 기록

혜미·2021년 10월 29일
0

TIL

목록 보기
10/29
post-thumbnail

MOD(no, 3) = 1이면 -> 사번1, 성명1
MOD(no, 3) = 2이면 -> 사번2, 성명2
MOD(no, 3) = 0이면 -> 사번3, 성명3

SELECT empno, ename FROM emp
(테스트용)

SELECT empno, ename, rownum, ceil(rownum/3)
    FROM emp
(테스트용)
    
SELECT ceil(rownum/3) no, empno, ename
  FROM emp
(테스트용)
  
근데 이렇게 하고 group by 하기 위해 empno, ename에 집계함수 주면
모든 데이터가 나오지를 않고
rno가 1인 애들의 max값.. 이런 식으로 집계돼서 나온다.
모든 데이터가 나오게 하려면 어떻게 해야 할까?
  
얘를 from절에 넣자

SELECT 
    ceil(rno/3) as rno
    ,MAX(DECODE(mod(rno,3),1,empno)) 사번_1열
    ,MAX(DECODE(mod(rno,3),1,ename)) 성명_1열
    ,MAX(DECODE(mod(rno,3),2,empno)) 사번_2열
    ,MAX(DECODE(mod(rno,3),2,ename)) 성명_2열
    ,MAX(DECODE(mod(rno,3),0,empno)) 사번_3열
    ,MAX(DECODE(mod(rno,3),0,ename)) 성명_3열
    FROM
        (
        SELECT rownum rno, empno, ename
        FROM emp
        )
 GROUP BY ceil(rno/3)
 ORDER BY rno
 
 DECODE문에 MAX를 씌웠을 때
 왜 각 컬럼의 MAX값이 아니라
 각 값의 MAX값(값이 1개니까 MAX를 씌워도 결과가 같은 거겠죠)이 나오는지는
 모르겠다.

-> 알았다!!!

SELECT 
    ceil(rno/3) as cno//🎇위 코드에선 rno라고 적었는데 rownum이랑 헷갈릴까 봐 cno로 바꿨다.
    ,DECODE(mod(rno,3),1,empno) 사번_1열
    ,DECODE(mod(rno,3),1,ename) 성명_1열
    ,DECODE(mod(rno,3),2,empno) 사번_2열
    ,DECODE(mod(rno,3),2,ename) 성명_2열
    ,DECODE(mod(rno,3),0,empno) 사번_3열
    ,DECODE(mod(rno,3),0,ename) 성명_3열
    FROM
        (
        SELECT rownum rno, empno, ename
        FROM emp
        )

이 코드를 실행하면

이런 사진이 나온다.
사번_1열 컬럼 중 CNO가 1번인 값이 3개인데 3개 중 2개가 NULL이니 최대값이 7369가 된다.

좀 더 자세한 설명:
오라클 sql문은 FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY 순서로 실행이 되므로 GROUP BY 에서 CNO별로 분류가 된다. 사번_1열 컬럼, CNO가 1인 행에는 7369, NULL, NULL인데 MAX를 하니 당연히 7369가 선택됨.

max 씌우고 cno로 group by, order by도 한 결과:


오라클 sql문 실행 순서는 https://myjamong.tistory.com/172 블로그의 글을 참고했다.

0개의 댓글