안녕하세요
MARK1 | MARK2 | MARK3 | MARK4 | MARK5 | MARK6 | MARK7 | MARK8 | MARK9 | MARK10 | MARK11 | MARK12 | MATL1 | MATL2 | MATL3 | MATL4 | MATL5 | MATL6 | MATL_CNT |
A1 | B1 | C | D1 | E1 | F1 | G1 | H1 | I1 | J1 | K1 | L1 | COIL1 | COIL2 | COIL3 | COIL4 | COIL5 | COIL6 | 6 |
A2 | B2 | C2 | D2 | E2 | T | G2 | H2 | I2 | J2 | K2 | L2 | COIL1 | COIL2 | COIL3 | 3 | |||
A3 | B3 | C3 | T | E3 | F3 | G3 | H3 | I3 | J3 | K3 | L3 | COIL1 | 1 |
위와 같은 데이터 테이블이 있을때
MARK1 | MARK2 | MARK3 | MARK4 | MARK5 | MARK6 | MARK7 | MARK8 | MARK9 | MARK10 | MARK11 | MARK12 | MARK13 | MARK14 | MARK15 | MARK16 | MARK17 |
A1 | B1 | COIL1 COIL2 | COIL3 COIL4 | COIL5 COIL6 | D1 | E1 | F1 | G1 | H1 | I1 | J1 | K1 | L1 | |||
A2 | B2 | C2 | D2 | E2 | COIL1 COIL2 | COIL3 | G2 | H2 | I2 | J2 | K2 | L2 | ||||
A3 | B3 | C3 | COIL1 | E3 | F3 | G3 | H3 | I3 | J3 | K3 | L3 |
이렇게 데이터를 조회 해야합니다.
컬럼 값이 'C' OR 'T' 인경우에 MATL1~6 항목을 MATL_CNT 값에 따라
5~6인경우 MATL1 || MATL2 , MATL3 || MATL4 , MATL5 || MATL6
3~4인경우 MATL1 || MATL2 , MATL3 || MATL4
1~2인경우 MATL1 || MATL2
위 테이블에 첫번째 ROW 를 예로 들면 MATL_CNT=6 이고 MARK3 컬럼값이 C 이므로
MARK3,MARK4.MARK5 컬럼을 MATL1 || MATL2 , MATL3 || MATL4 , MATL5 || MATL6
이렇게 조회한 후 MARK6 컬럼에 MARK4, MARK7 컬럼에 MARK5값을, MARK8 컬럼에 MARK6값을 출력해야 합니다.
효율적인 방법이 있을지 문의드립니다...
WITH t ( pk , mark1, mark2, mark3, mark4, mark5, mark6, mark7, mark8, mark9, mark10, mark11, mark12 , matl1, matl2, matl3, matl4, matl5, matl6 , matl_cnt ) AS ( SELECT 1 , 'A1', 'B1', 'C', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1' , 'COIL1', 'COIL2', 'COIL3', 'COIL4', 'COIL5', 'COIL6' , 6 FROM dual UNION ALL SELECT 2 , 'A2', 'B2', 'C2', 'D2', 'E2', 'T', 'G2', 'H2', 'I2', 'J2', 'K2', 'L2' , 'COIL1', 'COIL2', 'COIL3', '', '', '' , 3 FROM dual UNION ALL SELECT 3 , 'A3', 'B3', 'C3', 'T', 'E3', 'F3', 'G3', 'H3', 'I3', 'J3', 'K3', 'L3' , 'COIL1', '', '', '', '', '' , 1 FROM dual ) SELECT * FROM (SELECT pk , NVL(TRIM(v), mark) mark , ROW_NUMBER() OVER(PARTITION BY pk ORDER BY gb1, gb2) rn FROM (SELECT pk , TO_NUMBER(SUBSTR(gb, 5)) gb1 , mark , CASE WHEN mark IN ('C','T') THEN matl1||' '||matl2 ELSE ' ' END v1 , CASE WHEN mark IN ('C','T') THEN TRIM(matl3||' '||matl4) END v2 , CASE WHEN mark IN ('C','T') THEN TRIM(matl5||' '||matl6) END v3 FROM t UNPIVOT (mark FOR gb IN ( mark1, mark2, mark3, mark4, mark5, mark6 , mark7, mark8, mark9, mark10, mark11, mark12 ) ) ) UNPIVOT (v FOR gb2 IN (v1, v2, v3)) ) PIVOT (MIN(mark) FOR rn IN ( 1 mark1 , 2 mark2 , 3 mark3 , 4 mark4 , 5 mark5 , 6 mark6 , 7 mark7 , 8 mark8 , 9 mark9 , 10 mark10 , 11 mark11 , 12 mark12 , 13 mark13 , 14 mark14 ) ) ;