좀 보기 좋게 다시 수정하여 여쭙습니다.
쿼리 설명 : 지정된 코드 값(OBN_PF_CD) 보다는 작은것들중~ 상태값이 1,4이면서 상태값이 8인(최근건)보다는 큰건의 갯수를 구하는 코드입니다.
SELECT COUNT(0) CNT, AA.PF_YY, AA.ENP_CD
FROM TABLE_A AA
WHERE AA.DEL_YN = 'N'
AND AA.STAT_CD IN ('1', '4')
AND TO_NUMBER(AA.OBN_PF_CD) < TO_NUMBER(:OBN_PF_CD)
AND EXISTS(
SELECT TO_NUMBER(NVL(MAX(BB.OBN_PF_CD),0)) MAX_OBN_PF_CD
FROM TABLE_A BB
WHERE BB.DEL_YN = 'N'
AND BB.IZ_STAT_CD IN ('8')
AND TO_NUMBER(BB.OBN_PF_CD) < TO_NUMBER(:OBN_PF_CD)
AND TO_NUMBER(AA.OBN_PF_CD) > TO_NUMBER(BB.OBN_PF_CD)
GROUP BY BB.PF_YY, BB.ENP_CD
)
GROUP BY AA.PF_YY, AA.ENP_CD
의문사항
1. EXISTS 로 구현하였지만~ 해결 안되는 점이.. EXISTS 절은 서브쿼리 값이 존재할때만 실행되어야 하는데.. 없을때에도 실행된다는 문제가 있고요.
이런경우 어떻게 풀수 있을지 궁금합니다.
2. 위 코드보다 더 좋은 쿼리 방법이 있을지도 궁금합니다.
3. 컬럼 null 여부는 nvl로 하지만, row 단위의 data 존재여부를 알수있는 함수가 있을까요?
바쁘신데 죄송하고도 감사드립니다. 우선 OBN_PF_CD가 문자형이라 TO_NUMBER를 사용했구요. 년도, 업체별로 많은 등록 DATA갯수를 갖고있습니다.
동일한 년도, 업체에 상태 코드(STAT_CD)가 1, 4 가 무작위로 여러번 입력될수 있고요 , 부수 상태코드( IZ_STAT_CD) 가 8인놈이 있습니다.
등록코드(OBN_PF_CD)와 (최근 MAX 부수상태코드 가 8 인DATA ) 사이에 (1과4 상태코드)의 갯수를 파악하는게 목적입니다.
메인쿼리 그룹합수 사용 : 개수 COUNT
서브쿼리 그룹함수 사용 : 부수상태가 8인 최근 MAX OBN_PF_CD를 가져오기 위해서 입니다.
컬럼 구성 ------------------------------------------
- OBN_PF_CD : 시간개념의 등록코드 (시간DATA가 코드로 입력됨) <<PK>>
- PF_YY : 년도
- ENP_CD : 업체코드
- STAT_CD : 상태코드
- IZ_STAT_CD : 부수 상태코드
SELECT pf_yy, enp_cd , COUNT(*) cnt FROM (SELECT pf_yy , enp_cd , obn_pf_cd , stat_cd , iz_stat_cd , MAX(DECODE(iz_stat_cd, '8', obn_pf_cd)) OVER(PARTITION BY pf_yy, enp_cd) obn_pf_cd_max FROM table_a WHERE del_yn = 'N' AND (stat_cd IN ('1', '4') OR iz_stat_cd = '8') AND obn_pf_cd < :obn_pf_cd ) WHERE stat_cd IN ('1', '4') AND obn_pf_cd > obn_pf_cd_max GROUP BY pf_yy, enp_cd ;