안녕하세요..
도저히 답을 찾지 못하고, 도움을 청하게 되었습니다.
저희가 사용하는 DB는 Oracle 11g 이구요
아래 왼쪽표에 있는 값을 오른쪽 표와 같이 구현하고 싶은데요.
고수님들 도움을 청하고자 합니다.
| SEQ | COL | NO | COL1 | NO1 | COL2 | NO2 | |
| 1 | AAA | 3 | AAA | 3 | BBB | 8 | |
| 2 | BBB | 8 | CCC | 10 | DDD | 11 | |
| 3 | CCC | 10 | EEE | 14 | FFF | 17 | |
| 4 | DDD | 11 | 오른쪽 표로 변경 | GGG | 19 | HHH | 22 |
| 5 | EEE | 14 | III | 23 | JJJ | 24 | |
| 6 | FFF | 17 | KKK | 26 | |||
| 7 | GGG | 19 | |||||
| 8 | HHH | 22 | |||||
| 9 | III | 23 | |||||
| 10 | JJJ | 24 | |||||
| 11 | KKK | 26 |
SELECT MAX(CASE WHEN SQ = 0 THEN COL END ) COL1
, MAX(CASE WHEN SQ = 0 THEN NO END ) NO1
, MAX(CASE WHEN SQ = 1 THEN COL END ) COL2
, MAX(CASE WHEN SQ = 1 THEN NO END ) NO2
FROM ( SELECT ROUND(SEQ/2) GB
, MOD(SEQ+1,2) SQ
, T.*
FROM 테이블 T
)
GROUP BY GB
ORDER BY GB
고수님..정말 감사합니다.
한수 배웁니다.~~
오타나서 수정했어요.
seq 가 빈값이 없이 촘촘하다면? seq 를 그대로 이용하시면 되고
그게 아니라면 seq 를 이용해 순번을 다시 만들어 사용하셔야 합니다.
WITH t AS
(
SELECT 1 seq, 'AAA' col, 3 no FROM dual
UNION ALL SELECT 2, 'BBB', 8 FROM dual
UNION ALL SELECT 3, 'CCC', 10 FROM dual
UNION ALL SELECT 4, 'DDD', 11 FROM dual
UNION ALL SELECT 5, 'EEE', 14 FROM dual
UNION ALL SELECT 6, 'FFF', 17 FROM dual
UNION ALL SELECT 7, 'GGG', 19 FROM dual
UNION ALL SELECT 8, 'HHH', 22 FROM dual
UNION ALL SELECT 9, 'III', 23 FROM dual
UNION ALL SELECT 10, 'JJJ', 24 FROM dual
UNION ALL SELECT 11, 'KKK', 26 FROM dual
)
SELECT MIN(DECODE(x, 1, col)) col1
, MIN(DECODE(x, 1, no)) no1
, MIN(DECODE(x, 2, col)) col2
, MIN(DECODE(x, 2, no)) no2
FROM (SELECT col, no
, CEIL(rn / 2) y
, MOD(rn - 1, 2) + 1 x
FROM (SELECT col, no
, ROW_NUMBER() OVER(ORDER BY seq) rn
FROM t
)
)
GROUP BY y
ORDER BY y
;