오라클 쿼리 출력 질문 입니다. 0 5 822

by 월화수목금금금 [SQL Query] [2018.06.16 03:32:46]


캡처.PNG (39,305Bytes)

* 데이터                
PK1 PK2 PK3 PK4          
T1 FIST_DT SEQ_NO SEQ_NEXT_NO STAR_DT END_DT AD_DT GUBUN  
283 20130210 1 2 20170725 20170725 20170907 10  
283 20130210 1 3 20170726 20170726 20170907 10  
283 20130210 1 4 20170808 20170808 20170907 10  
283 20130210 1 6 20171015 20180114 20170907 10  
283 20130210 1 12 20171104 20180114 20171107 10  
283 20130210 1 5 20170815 20171014 20170907 20  
283 20130210 1 13 20171106 20171204 20071115 20  
                 
*결과                
PK1 PK2 PK3 생성 PK MAX값 10중에 STAR_DT 가 가장 작은값 10중에 STAR_DT 가 가장 작은값의 END_DT 20중에 STAR_DT 가 가장 작은값 20중에 STAR_DT 가 가장 작은값
T1 FIST_DT SEQ_NO NEW_SEQ AD_DT STAR_DT_10 END_DT_10 STAR_DT_20 END_DT_20
283 20130210 1 1 20171107 20170725 20170725 20170815 20171014
위에 로우와 동일 위에 로우와 동일 위에 로우와 동일 시퀀스하게 생성 위에 로우와 동일 10중에 위에 로우 뺀 STAR_DT MIN 값 10중에 위에 로우 뺀 END_DT MAX 값 20중에 위에 로우 뺀 STAR_DT MIN 값 20중에 위에 로우 뺀 END_DT MAX 값
283 20130210 1 2 20171107 20170726 20180114 20171106 20171204



위에 데이터를 패턴 데이터를 
2개의 로우로 생성을 하는데 처음 생성하는 데이터는 PK 1 2 3 기준으로 AD_DT의 MAX값을 가져가서 생성하고 나머지 컬럼은 비교를 하여 따로따로 붙여야 되는 상황 입니다. 어떻게 해야 될까요
자세한 설명은 말로 풀기가 힘들어서 표로 표현 했습니다.



WITH t AS
(
SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 2 SEQ_NEXT_NO, '20170725' STAR_DT, '20170725' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 3 SEQ_NEXT_NO, '20170726' STAR_DT, '20170726' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 4 SEQ_NEXT_NO, '20170808' STAR_DT, '20170808' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 6 SEQ_NEXT_NO, '20171015' STAR_DT, '20180114' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 12 SEQ_NEXT_NO, '20171104' STAR_DT, '20180114' END_DT, '20171107' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 5 SEQ_NEXT_NO, '20170815' STAR_DT, '20171014' END_DT, '20170909' AD_DT, '20' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 13 SEQ_NEXT_NO, '20171106' STAR_DT, '20171204' END_DT, '20071115' AD_DT, '20' GUBUN
)

 

by 우리집아찌 [2018.06.18 09:02:01]

GUBUN은 항상 10 , 20 고정인가요?


by 우리집아찌 [2018.06.18 09:34:49]
-- MS-SQL이 구버젼이라 DENCE_RANK() 는 테스트 안됨.. ㅡㅡ;
WITH t AS
(
SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 2 SEQ_NEXT_NO, '20170725' STAR_DT, '20170725' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 3 SEQ_NEXT_NO, '20170726' STAR_DT, '20170726' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 4 SEQ_NEXT_NO, '20170808' STAR_DT, '20170808' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 6 SEQ_NEXT_NO, '20171015' STAR_DT, '20180114' END_DT, '20170907' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 12 SEQ_NEXT_NO, '20171104' STAR_DT, '20180114' END_DT, '20171107' AD_DT, '10' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 5 SEQ_NEXT_NO, '20170815' STAR_DT, '20171014' END_DT, '20170909' AD_DT, '20' GUBUN
UNION ALL SELECT 283 T1, '20130210' FIST_DT, 1 SEQ_NO, 13 SEQ_NEXT_NO, '20171106' STAR_DT, '20171204' END_DT, '20071115' AD_DT, '20' GUBUN
) , T2 AS (
SELECT 1 lv
 UNION ALL
SELECT lv + 1 lv
  FROM T2
 WHERE lv + 1 <= 2
)

				 
SELECT T1
     , FIST_DT  
     , SEQ_NO
     , LV AS NEW_SEQ
     , MAX_STAR_DT AS AD_DT
     , CASE WHEN lv = 1 THEN STAR_DT_10_1 ELSE STAR_DT_10_2 END STAR_DT_10
     , CASE WHEN lv = 1 THEN END_DT_10_1  ELSE END_DT_10_2  END END_DT_10
     , CASE WHEN lv = 1 THEN STAR_DT_20_1 ELSE STAR_DT_20_2 END STAR_DT_20
     , CASE WHEN lv = 1 THEN END_DT_20_1  ELSE END_DT_20_2  END END_DT_20
  FROM (SELECT MAX(A.T1) T1 
			 , MAX(A.FIST_DT)     FIST_DT
			 , MAX(A.SEQ_NO)      SEQ_NO
			 , MAX(A.MAX_STAR_DT) MAX_STAR_DT
			 , MAX(CASE WHEN STAR_DT_MIN_SORT = 1 AND GUBUN = 10 THEN STAR_DT END ) STAR_DT_10_1
			 , MAX(CASE WHEN STAR_DT_MIN_SORT = 2 AND GUBUN = 10 THEN STAR_DT END ) STAR_DT_10_2
			 , MAX(CASE WHEN END_DT_MIN_SORT  = 1 AND GUBUN = 10 THEN END_DT  END ) END_DT_10_1
			 , MAX(CASE WHEN END_DT_MIN_SORT  = 2 AND GUBUN = 10 THEN END_DT  END ) END_DT_10_2
			 , MAX(CASE WHEN STAR_DT_MIN_SORT = 1 AND GUBUN = 20 THEN STAR_DT END ) STAR_DT_20_1
			 , MAX(CASE WHEN STAR_DT_MIN_SORT = 2 AND GUBUN = 20 THEN STAR_DT END ) STAR_DT_20_2
			 , MAX(CASE WHEN END_DT_MIN_SORT  = 1 AND GUBUN = 20 THEN END_DT  END ) END_DT_20_1
			 , MAX(CASE WHEN END_DT_MIN_SORT  = 2 AND GUBUN = 20 THEN END_DT  END ) END_DT_20_2	 
		  FROM (
				SELECT T1 
					 , FIST_DT
					 , SEQ_NO
					 , SEQ_NEXT_NO
					 , GUBUN  
					 , STAR_DT
					 , END_DT
					 , MAX(AD_DT) OVER() MAX_STAR_DT
					 , DENCE_RANK() OVER(PARTITION BY GUBUN ORDER BY STAR_DT ASC ) STAR_DT_MIN_SORT
					 , DENCE_RANK() OVER(PARTITION BY GUBUN ORDER BY END_DT DESC ) END_DT_MIN_SORT
				 FROM T
			   ) A 
		) AA
	  , T2 BB
  	

 


by 월화수목금금금 [2018.06.18 12:15:17]

아니요 다른 코드 값도 있습니다


by 우리집아찌 [2018.06.18 13:19:23]

코드가 추가되면 select 되는 컬럼도 증가되나요?


by 마농 [2018.06.19 09:34:09]

음...
제목은 오라클인데? WITH 구문은 FROM dual 이 없는걸로 보면 오리클이 아닌데요?
제목대로 오라클로 답변합니다.
 

WITH t AS
(
SELECT 283 t1, '20130210' fist_dt, 1 seq_no, 2 seq_next_no, '20170725' star_dt, '20170725' end_dt, '20170907' ad_dt, '10' gubun FROM dual
UNION ALL SELECT 283, '20130210', 1,  3, '20170726', '20170726', '20170907', '10' FROM dual
UNION ALL SELECT 283, '20130210', 1,  4, '20170808', '20170808', '20170907', '10' FROM dual
UNION ALL SELECT 283, '20130210', 1,  6, '20171015', '20180114', '20170907', '10' FROM dual
UNION ALL SELECT 283, '20130210', 1, 12, '20171104', '20180114', '20171107', '10' FROM dual
UNION ALL SELECT 283, '20130210', 1,  5, '20170815', '20171014', '20170909', '20' FROM dual
UNION ALL SELECT 283, '20130210', 1, 13, '20171106', '20171204', '20071115', '20' FROM dual
)
SELECT *
  FROM (SELECT t1, fist_dt, seq_no, gubun
             , new_seq
             , ad_dt
             , star_dt st_dt
             , CASE WHEN new_seq = 1 THEN end_dt ELSE end_dt_2 END ed_dt
          FROM (SELECT t1, fist_dt, seq_no, gubun
                     , star_dt, end_dt
                     , ROW_NUMBER() OVER(PARTITION BY t1, fist_dt, seq_no, gubun ORDER BY star_dt) new_seq
                     , MAX( ad_dt ) OVER(PARTITION BY t1, fist_dt, seq_no, gubun) ad_dt
                     , MAX(end_dt ) OVER(PARTITION BY t1, fist_dt, seq_no, gubun) end_dt_2
                  FROM t
                ) a
         WHERE new_seq <= 2
        ) a
 PIVOT (MIN(ad_dt) ad_dt, MIN(st_dt) st_dt, MIN(ed_dt) ed_dt
        FOR gubun IN (10, 20, 30)) a
;

 

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