아래 행의 데이터와 비교후 병합(GROUP BY)이 가능 할까요? 0 5 1,476

by 스파이 [2016.12.02 11:03:20]


SELECT (SELECT CD_NM 
                                  FROM SY5020
                                 WHERE C_CD = :C_CD
                                   AND IDX_CD = 'OM100'
                                   AND CD = '01') CD_NM 
                             , T.STA_YMD
                             , LEAST(T.END_YMD, LEAST(NVL(:RETIRE_YMD, '99991231'), TO_CHAR(SYSDATE,'YYYYMMDD'))) END_YMD
                          FROM PA1020 T, OM0010 A
                                 WHERE T.C_CD = :C_CD
                                   AND T.EMP_ID = :EMP_ID
                                   AND T.C_CD = A.C_CD
                                   AND T.ORG_ID = A.ORG_ID
                                   AND T.LAST_YN = 'Y'
                                   AND T.END_YMD BETWEEN A.STA_YMD AND A.END_YMD

 

 

해당 쿼리의 결과값은

CD_NM STA_YMD END_YMD
상품 20110201 20110430
상품 20110501 20111231
상품 20120101 20121231
상품 20130101 20130331
상품 20130401 20140506
상품 20140507 20141015
상품 20141016 20161202

이렇게 나옵니다.

이 결과값을 

 

CD_NM STA_YMD END_YMD
상품 20110201 20161202

이런식으로 처리가 가능 할까요?

아래행의 컬럼값(CD_NM) 을 비교하여 같은 이름일 경우 합치는건데

같은 이름일 경우 STA_YMD 일자는 시작일자로, END_YMD는 마지막 최근 종료일자가 되야 합니다.

어떻게 풀어 나가야 할지 방법이 떠오르지 않아서...

혹시나 가능 할지 궁금 합니다.

by 랑에1 [2016.12.02 11:14:07]
SELECT cd_nm, MIN(sta_ymd) sta_ymd, MAX(end_ymd) end_ymd
FROM (위의쿼리)
GROUP BY cd_nm

 

이렇게 하면 나오긴 할텐데 애초에 안쪽에서 cd_nm을 가져오기전에 cd로 그룹핑한 후에

cd_nm 가져오는게 나을 것 같아요 ㅎㅎ

 


by 스파이 [2016.12.02 11:17:25]

오! 한번 해보겠습니다!


by 스파이 [2016.12.02 11:38:07]

오!~ 감사합니다 

 

SELECT CD_NM, MIN(STA_YMD) STA_YMD, MAX(END_YMD) END_YMD
                    FROM (SELECT C.CD_NM, T.STA_YMD, LEAST(T.END_YMD, LEAST(NVL(:RETIRE_YMD, '99991231'), TO_CHAR(SYSDATE,'YYYYMMDD'))) END_YMD
                          FROM PA1020 T, OM0010 A, SY5020 C
                                 WHERE T.C_CD = :C_CD
                                   AND T.EMP_ID = :EMP_ID
                                   AND T.C_CD = A.C_CD
                                   AND T.ORG_ID = A.ORG_ID
                                   AND T.C_CD = C.C_CD
                                   AND A.ORG_GRP_CD = C.CD
                                   AND C.IDX_CD = 'OM100'
                                   AND C.CD = '03'
                                   AND T.LAST_YN = 'Y'
                                   AND T.END_YMD BETWEEN A.STA_YMD AND A.END_YMD)
            GROUP BY CD_NM

공통코드 쪽에서 코드 값을 대입해보니 조금 문제가 있는거 같아 조금 변형하니 잘 나옵니다.

감사합니다!!~


by 마농 [2016.12.02 11:37:35]

이해가 안가네요?
CD_NM 을 가져오는 조건이 (CD = '01')로 고정 조건이네요.
그러면 CD_NM 이 고정값 이겠네요?
위아래 행간 비교할 필요도 없이 그냥 전체 MIN, MAX 이용하면 될 듯요.
아니면 CD 조건 잘못 주신건 아닌지?


by 스파이 [2016.12.02 11:42:40]

아! 원래 대로라면 

OM0010 테이블에 저장되어 있는 키 값

SY5020에 키 값, 키 네임이 저장 되어 있어

2개를 조인 걸었어야 했는데

제 실수로 테스트 하는 소스를 가져왔습니다.

그리고 말씀 주신대로 01, 02, 03 아예 키 값을 부여 할 예정이라 말씀주신 것 처럼 MIN, MAX로 GROUP BY 하니 생각했던 결과가 나왔습니다.

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