좀 보기 좋게 다시 수정하여 여쭙습니다.
쿼리 설명 : 지정된 코드 값(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 존재여부를 알수있는 함수가 있을까요?
서브쿼리를 추상화 시켜서 표현해 주셨네요.
그러면 처음보는 사람은 오류 원인을 알수가 없죠.
있는 그대로 보여 주세요.
네 말씀하신대로 수정해서 다시 올렸습니다.
매번~ 감사드립니다.
AND DECODE(SIGN([max-code subquery] - [code]), -1, 0, 1) = 1
이런식의 비교는 어떨까요? decode 에서 NULL 이나 조건이 만족하는 경우 1 이 나오도록...
아니면 어찌저찌 분석함수로도 될 것 같구요.
의견 감사드립니다. ^^
쿼리 설명과 작성 쿼리가 너무 거리가 머네요.
그래서 쿼리 설명이 선 듯 이해가 안가는 부분도 있구요.
- 메인쿼리와 서브쿼리에서 그룹바이는 왜 하는건지?
- To_number 는 왜 하는 것인지?
바쁘신데 죄송하고도 감사드립니다. 우선 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 : 부수 상태코드
문자형이라고 무조건 to_number 을 붙여야 하는 건 아니죠?
고정길이 코드('001','010' 등)라면 숫자로 변환할 필요가 없습니다.
가변길이라면 다르겠지만요('1','100' 등)
네~ 모르고 있었는데 감사합니다.
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
;
꾸뻑 ( - - ) ( _ _ ) 감사드립니다. Lol
참 마농님 덕분에~ 지식이 풍족해지네요.
좋은 밤 보내십시요~~~~