안녕하세요
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값을 출력해야 합니다.
효율적인 방법이 있을지 문의드립니다...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | 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 ) ) ; |