경우의 수로 row 복제... 0 4 2,155

by park1q [SQL Query] [2011.09.15 19:16:38]



아~~ 해보다 해보다..여기 올리게 되네요..
정말 오랫만에 들렀네요..아래 데이타가 있습니다.

WITH T AS (
SELECT 'A1' COL_A , NULL COL_B, NULL COL_C, NULL COL_D , NULL COL_E FROM DUAL UNION ALL
SELECT NULL  , 'B1' , NULL , NULL , NULL FROM DUAL UNION ALL
SELECT NULL  , NULL , 'C1' , NULL , NULL FROM DUAL UNION ALL
SELECT NULL  , NULL , 'C2' , NULL , NULL FROM DUAL UNION ALL
SELECT NULL  , NULL , NULL , NULL , 'E1' FROM DUAL UNION ALL
SELECT NULL  , NULL , NULL , NULL , 'E2' FROM DUAL UNION ALL
SELECT NULL  , NULL , NULL , NULL , 'E3' FROM DUAL UNION ALL
SELECT NULL  , NULL , NULL , NULL , 'E4' FROM DUAL UNION ALL
SELECT NULL  , NULL , NULL , 'D1' , NULL FROM DUAL UNION ALL
SELECT NULL  , NULL , NULL , 'D2' , NULL FROM DUAL UNION ALL
SELECT NULL  , NULL , NULL , 'D3' , NULL FROM DUAL  )
SELECT * FROM T
(data set)
COL_A COL_B COL_C COL_D COL_E
A1        
  B1      
    C1    
    C2    
        E1
        E2
        E3
        E4
      D1  
      D2  
      D3  



원하는 결과는 다음과 같습니다. 위 데이타셋을 가지고 2*3*4=24 개의 각각 유니크한 rowset 을 만드는겁니다.

COL_A COL_B COL_C COL_D COL_E
A1 B1 C1 D1 E1
A1 B1 C1 D1 E2
A1 B1 C1 D1 E3
A1 B1 C1 D1 E4
A1 B1 C1 D2 E1
A1 B1 C1 D2 E2
A1 B1 C1 D2 E3
A1 B1 C1 D2 E4
A1 B1 C1 D3 E1
A1 B1 C1 D3 E2
A1 B1 C1 D3 E3
A1 B1 C1 D3 E4
A1 B1 C2 D1 E1
A1 B1 C2 D1 E2
A1 B1 C2 D1 E3
A1 B1 C2 D1 E4
A1 B1 C2 D2 E1
A1 B1 C2 D2 E2
A1 B1 C2 D2 E3
A1 B1 C2 D2 E4
A1 B1 C2 D3 E1
A1 B1 C2 D3 E2
A1 B1 C2 D3 E3
A1 B1 C2 D3 E4

고수님들 부탁좀 드리겠습니다.
by 허재영 [2011.09.15 20:18:01]
crose join을 사용하면 됩니다.

select COL_A, COL_B, COL_C, COL_D, COL_E from
(select COL_A from T where COL_A is not null),
(select COL_B from T where COL_B is not null),
(select COL_C from T where COL_C is not null),
(select COL_D from T where COL_D is not null),
(select COL_E from T where COL_E is not null)
order by 1, 2, 3, 4, 5

by park1q [2011.09.16 07:39:59]
빠른 답변 감사드립니다 좀 응용은 해야 되겠지만 시원한 답이 되었습니다

by 마농 [2011.09.16 16:38:51]
WITH T AS
(
SELECT 'A1' COL_A , NULL COL_B, NULL COL_C, NULL COL_D , NULL COL_E FROM DUAL UNION ALL
SELECT NULL , 'B1' , NULL , NULL , NULL FROM DUAL UNION ALL
SELECT NULL , NULL , 'C1' , NULL , NULL FROM DUAL UNION ALL
SELECT NULL , NULL , 'C2' , NULL , NULL FROM DUAL UNION ALL
SELECT NULL , NULL , NULL , NULL , 'E1' FROM DUAL UNION ALL
SELECT NULL , NULL , NULL , NULL , 'E2' FROM DUAL UNION ALL
SELECT NULL , NULL , NULL , NULL , 'E3' FROM DUAL UNION ALL
SELECT NULL , NULL , NULL , NULL , 'E4' FROM DUAL UNION ALL
SELECT NULL , NULL , NULL , 'D1' , NULL FROM DUAL UNION ALL
SELECT NULL , NULL , NULL , 'D2' , NULL FROM DUAL UNION ALL
SELECT NULL , NULL , NULL , 'D3' , NULL FROM DUAL
)
, t1 AS
(
SELECT COALESCE(col_a, col_b, col_c, col_d, col_e) col
, CASE WHEN col_a IS NOT NULL THEN 1
WHEN col_b IS NOT NULL THEN 2
WHEN col_c IS NOT NULL THEN 3
WHEN col_d IS NOT NULL THEN 4
WHEN col_e IS NOT NULL THEN 5
END lv
FROM t
)
SELECT SYS_CONNECT_BY_PATH(col, ',')
FROM t1
WHERE lv = 5
START WITH lv = 1
CONNECT BY PRIOR lv + 1 = lv
;

by park1q [2011.09.20 16:46:41]
우~~마농님..올만입니다.
역시 COALESCE 를 이런곳에서도 사용하는군요..
원했던 건 칼럼이었는데..유용하게 참고하겠습니다.
수고하세요..
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입