with문을 이용해 데이터를 출력 하는 도중 최대값을 구하는 부분에서 막힙니다 ㅠ 0 3 3,584

by 스파이 [SQL Query] with max [2012.10.10 16:14:45]


WITH ELECDATA AS 
(SELECT DISTINCT B.*
FROM CM_ELEC_APPR_REQ A, CM_ELEC_APPR B
    WHERE A.APPR_REQ_TYPE_NAME LIKE 'SP_BS_%'
  AND A.APPR_REQ_KEY_TEXT LIKE '00323@0@327%'
  AND A.APPR_REQ_NO = B.APPR_REQ_NO)
SELECT   A.USE_CNST_APPR_REQ_NO,
A.ORGT_MOV_APPR_REQ_NO,
A.AUTH_USE_CNST_APPR_REQ_NO,
A.ORGT_OWNTR_APRV_APPR_REQ_NO,
(SELECT DISTINCT MAX(RECMDLT_APPR_REQ_NO) FROM  BS_LOAN WHERE BDD_ID=A.BDD_ID  
AND BDD_TYPE = A.BDD_TYPE AND CONT_MGT_NO = A.CONT_MGT_NO)AS RECMDLT_APPR_REQ_NO,
C.AR_ORGT_APPR_REQ_NO
    FROM BS_CONTDET A, ELECDATA B, BS_LOAN C, ELECDATA B1
   WHERE A.BDD_ID = '00323'
AND A.BDD_TYPE = '0'
AND A.CONT_MGT_NO = '327'
AND A.NOW_CONT_YN = 'Y'
AND A.ORGT_OWNTR_APRV_APPR_REQ_NO = B.APPR_REQ_NO(+)
AND A.BDD_ID = C.BDD_ID
AND A.BDD_TYPE = C.BDD_TYPE
AND A.CONT_MGT_NO = C.CONT_MGT_NO
AND C.AR_ORGT_APPR_REQ_NO = B1.APPR_REQ_NO
ORDER BY C.RECMDLT_APPR_REQ_NO DESC

--------------------------------------------------------------------------------------------------
출력하려는 이 쿼리문에서 C.RECMDLT_APPR_REQ_NO 이 컬럼이 여러개가 나올 수 있는데
가장 높은 데이터 1개를 출력 하려면 어떻게 수정해야 할까요? ㅠ
max를 통해서도 출력해 봤으나 2개가 출력 되는데...
방법 아시는 분 어떻게 해야 효율적으로 뽑아 낼 수 있는지 답변 부탁드립니다.
by 스파이 [2012.10.10 16:25:43]
 

흐으음...
WITH ELECDATA AS /* 특정 필지의 전자결재 내역 조회  */
(SELECT DISTINCT B.*
FROM CM_ELEC_APPR_REQ A, CM_ELEC_APPR B
    WHERE A.APPR_REQ_TYPE_NAME LIKE 'SP_BS_%'
  AND A.APPR_REQ_KEY_TEXT LIKE '00323@0@327%'
  AND A.APPR_REQ_NO = B.APPR_REQ_NO)
SELECT   A.USE_CNST_APPR_REQ_NO,
A.ORGT_MOV_APPR_REQ_NO,
A.AUTH_USE_CNST_APPR_REQ_NO,
A.ORGT_OWNTR_APRV_APPR_REQ_NO,
(SELECT MAX(RECMDLT_APPR_REQ_NO) FROM  BS_LOAN WHERE BDD_ID=A.BDD_ID 
    AND BDD_TYPE = A.BDD_TYPE AND CONT_MGT_NO = A.CONT_MGT_NO )AS RECMDLT_APPR_REQ_NO,
(SELECT MAX(AR_ORGT_APPR_REQ_NO) FROM  BS_LOAN WHERE BDD_ID=A.BDD_ID 
    AND BDD_TYPE = A.BDD_TYPE AND CONT_MGT_NO = A.CONT_MGT_NO )AS AR_ORGT_APPR_REQ_NO
    FROM BS_CONTDET A, ELECDATA B, BS_LOAN C, ELECDATA B1
   WHERE A.BDD_ID = '00323'
AND A.BDD_TYPE = '0'
AND A.CONT_MGT_NO = '327'
AND A.NOW_CONT_YN = 'Y'
AND A.ORGT_OWNTR_APRV_APPR_REQ_NO = B.APPR_REQ_NO(+)
AND A.BDD_ID = C.BDD_ID
AND A.BDD_TYPE = C.BDD_TYPE
AND A.CONT_MGT_NO = C.CONT_MGT_NO
AND C.AR_ORGT_APPR_REQ_NO = B1.APPR_REQ_NO
AND ROWNUM='1';

---------------------------------------------------------------------------------------
이렇게 수정을 해서 원하는 데이터를 얻긴 했는데...
이런식으로 뽑는게 효율적인지... ㅠ 으... 너무 힘드네요


by 손님 [2012.10.10 17:20:26]

with as select 절에 disticnt 를 주고 밑에는 빼버리면 됩니다.

by 마농 [2012.10.10 17:31:17]
-- MAX(recmdlt_appr_req_no) 와 MAX(ar_orgt_appr_req_no) 을
-- 스칼라서브쿼리로 각각 따로 가져오네요.
-- 이때 서로 다른 쿼리이므로 서로 다른 행의 결과를 가져 올 수도 있습니다.
-- MAX(a) 와 MAX(b) 에서 같은 행이라도 a가 크다고 해서 b도 크다는 보장은 없지요.
-- 인라인뷰 안에서 Row_Number 로 번호 부여 후 밖에서 1번만 조회하면 됩니다.
SELECT *
  FROM (SELECT ...
             , c.recmdlt_appr_req_no
             , c.ar_orgt_appr_req_no
             , ROW_NUMBER() OVER(
               PARTITION BY a.bdd_id, a.bdd_type, a.cont_mgt_no
               ORDER BY c.recmdlt_appr_req_no DESC
               ) rn
          FROM ...
         WHERE ...
        )
 WHERE rn = 1
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입