(수정후 재질문 ) 쿼리 질문 - subquery 결과 파악 방법 0 10 1,869

by skyconfia [SQL Query] [2014.08.28 14:50:47]


좀 보기 좋게 다시 수정하여 여쭙습니다.

쿼리 설명 : 지정된 코드 값(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 존재여부를 알수있는 함수가 있을까요?

by 마농 [2014.08.28 15:44:56]

서브쿼리를 추상화 시켜서 표현해 주셨네요.

그러면 처음보는 사람은 오류 원인을 알수가 없죠.

있는 그대로 보여 주세요.


by skyconfia [2014.08.28 16:34:54]

네 말씀하신대로 수정해서 다시 올렸습니다.

매번~ 감사드립니다.


by 비주류 [2014.08.28 16:54:08]

AND DECODE(SIGN([max-code subquery] - [code]), -1, 0, 1) = 1

이런식의 비교는 어떨까요? decode 에서 NULL 이나 조건이 만족하는 경우 1 이 나오도록...

아니면 어찌저찌 분석함수로도 될 것 같구요.


by skyconfia [2014.08.28 17:24:11]

의견 감사드립니다. ^^


by 마농 [2014.08.28 17:05:15]

쿼리 설명과 작성 쿼리가 너무 거리가 머네요.
그래서 쿼리 설명이 선 듯 이해가 안가는 부분도 있구요.
 - 메인쿼리와 서브쿼리에서 그룹바이는 왜 하는건지?
 - To_number 는 왜 하는 것인지?


by skyconfia [2014.08.28 17:20:04]

바쁘신데 죄송하고도 감사드립니다.  우선 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 : 부수 상태코드

 


by 마농 [2014.08.28 17:27:01]

문자형이라고 무조건 to_number 을 붙여야 하는 건 아니죠?

고정길이 코드('001','010' 등)라면 숫자로 변환할 필요가 없습니다.

가변길이라면 다르겠지만요('1','100' 등)


by skyconfia [2014.08.28 17:35:26]

네~ 모르고 있었는데 감사합니다.


by 마농 [2014.08.28 18:23:54]
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
;

 


by skyconfia [2014.08.28 22:35:56]

꾸뻑 ( - - )   ( _ _ )   감사드립니다. Lol 

참 마농님 덕분에~ 지식이 풍족해지네요.

좋은 밤 보내십시요~~~~

 

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