SQL 문의드립니다. 0 1 1,120

by zzhozang [2015.12.01 18:35:20]


안녕하세요

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값을 출력해야 합니다.

효율적인 방법이 있을지 문의드립니다...

by 마농 [2015.12.02 08:50:39]
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
                            ) )
;

 

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