본문 바로가기

개발하자/ORACLE

동일 컬럼값 안보여주기

1.동일 칼럼값 안보여주기

[1번문제]

원래 테이블:test11

 

먼저 학년별로 가공하기

SELECT COLL
      ,DEPT,DECODE(CNT,1,'1학년',2,'2학년',3,'3학년',4,'4학년') K,
      DECODE(CNT,1,FRE,2,SUP,3,JUN,4,SEN) A
FROM TEST11,(SELECT ROWNUM CNT
            FROM USER_TABLES
            WHERE ROWNUM<5)
            ORDER BY DEPT,K;

  

 

가공된 테이블로 동일 컬럼값 제거 시작!!


(1)
select decode(a.coll,b.coll,null,a.coll) coll
       ,decode(a.coll||A.dept,B.coll||B.dept,null,A.dept) dept
       ,a.grade,a.person
from
    (select row_number() over (order by dept,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년'))num
            ,coll,dept
            ,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년')grade
            ,decode(cnt,1,fre,2,sup,3,jun,4,sen)person
    from test11,(
                 select rownum cnt
                 from user_tables
                 where rownum<5
     )) a,
    (select row_number() over (order by dept,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년'))num
            ,coll,dept
            ,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년')grade
            ,decode(cnt,1,fre,2,sup,3,jun,4,sen)person
    from test11,(
                 select rownum cnt
                 from user_tables
                 where rownum<5
     )) b
where a.num-1=b.num(+)
order by a.num
;

 

(2)LAG함수를 이용하여 다시 풀기
select decode(coll,ary_coll,null,coll) coll
      ,decode(coll||dept,ary_coll||ary_dept,null,dept) dept
      ,grade
      ,person
from  
   (
    select row_number() over (order by dept,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년'))num
           ,coll,dept
           ,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년')grade
           ,decode(cnt,1,fre,2,sup,3,jun,4,sen)person
           ,lag(coll) over(order by coll,dept,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년')) ary_coll
           ,lag(dept) over(order by coll,dept,decode(cnt,1,'1학년',2,'2학년',3,'3학년',4,'4학년')) ary_dept
    from test11,(
                 select rownum cnt
                 from user_tables
                 where rownum<5
                 )
    );

 

[2번문제] emp 테이블

원래 테이블보기


(1)
select decode(a.deptno,b.deptno,null,a.deptno) deptno
      ,decode(a.deptno||a.job,b.deptno||b.job,null,a.job) job
      ,a.ename
from (select row_number() over(order by deptno,job) num
             ,deptno,job,ename
     from emp)a
    ,(select row_number() over(order by deptno,job) num
            ,deptno,job,ename
    from emp)b
where a.num-1=b.num(+)
order by a.num;

 

 

(2)LAG함수를 이용하여 다시 풀기
select decode(deptno,dep1,null,deptno) dept
      ,decode(deptno||job,dep1||job1,null,job) job
      ,ename
from (
      select deptno,job
            ,lag(deptno) over(order by deptno,job) dep1
            ,lag(job) over(order by deptno,job) job1
            ,ename
      from emp        
      )
;