UNION ALL 질문드립니다. 0 6 236

by 잘하고싶은사원 [SQL Query] [2019.04.12 11:04:39]


같은 테이블에 데이터인데

아래 와 같이 데이터가 있는데

A 100 Y
B 200 Y
C 300 Y
D 400 Y
Z 1000 N
X 1100 N
V 1200

N

 

A 100 Z 1000
B 200 X 1100
C 300 V 1200
D 400    

 위 처럼 바꾸는게 잘 안되어서 질문드립니다..

제가 UNION ALL로

데이터 가져와서 위에서 그룹으로 묶어서 하려는데 잘 안되네요 ㅠㅠ

 

by 우리집아찌 [2019.04.12 11:18:42]

dbms부터 알려주세요


by 잘하고싶은사원 [2019.04.12 11:27:12]

오라클 11g 입니다.


by 마농 [2019.04.12 13:12:43]
-- Oracle --
WITH t AS
(
SELECT 'A' cd, 100 v, 'Y' yn FROM dual
UNION ALL SELECT 'B',  200, 'Y' FROM dual
UNION ALL SELECT 'C',  300, 'Y' FROM dual
UNION ALL SELECT 'D',  400, 'Y' FROM dual
UNION ALL SELECT 'Z', 1000, 'N' FROM dual
UNION ALL SELECT 'X', 1100, 'N' FROM dual
UNION ALL SELECT 'V', 1200, 'N' FROM dual
)
-- 1. 전통 방식 MIN(DECODE( 10G 이전
SELECT rn
     , MIN(DECODE(yn, 'Y', cd)) y_cd
     , MIN(DECODE(yn, 'Y', v )) y_v
     , MIN(DECODE(yn, 'N', cd)) n_cd
     , MIN(DECODE(yn, 'N', v )) n_v
  FROM (SELECT cd, v, yn
             , ROW_NUMBER() OVER(PARTITION BY yn ORDER BY v, cd) rn
          FROM t
        )
 GROUP BY rn
 ORDER BY rn
;
-- 2. PIVOT 11G 이후
SELECT *
  FROM (SELECT cd, v, yn
             , ROW_NUMBER() OVER(PARTITION BY yn ORDER BY v, cd) rn
          FROM t
        )
 PIVOT (MIN(cd) cd, MIN(v) v FOR yn IN ('Y' y, 'N' n))
 ORDER BY rn
;

 


by 잘하고싶은사원 [2019.04.12 14:29:08]

감사합니다. PIVOT 활용해서 완성했습니다.


by 우리집아찌 [2019.04.12 13:20:04]

 

1. full outer join

select * from

(select row_number() over( order by 컬럼2 ) rn , 컬럼1 , 컬럼2 where 컬럼3 = ‘Y’ ) a

full outer join 

(select row_number() over( order by 컬럼2 ) rn ,

컬럼1 , 컬럼2 where 컬럼3 = ‘N’ ) b

on a.rn = b.rn

 

2. row_number() ovet( partition by 컬럼3 order by 컬럼2 이용하셔서 group by rn 하셔서 max값으로 추출하시면 됩니다

 

 


by 잘하고싶은사원 [2019.04.12 14:29:22]

감사합니다. 잘 참고하여 완성하였습니다

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입