cube로 어떻게든 해볼려고 했는데.. 0 3 3,337

by 볼우물 cube rollup [2010.02.17 18:05:36]


test.xls (30,720Bytes)


안녕하세요.
다들 설은 잘 보내셨는지...
쿼리를 짜볼려고 끙끙 해봐도 잘 안되네요..
cube로 해야 할 것 같은데..

ACCOUNTNO\bank\ RAISE_TIME\ MSG_TYPE\ RECV_AMT\ RECV_DATE\ NAB_AMT\ NAB_DATE

62691169684237\ 081\ 20100216140510\ 수취조회\ 2490000\ 20100213\ 2490000 \ 20100202
62691169684237\ 081\ 20100216130410\ 수취조회\ 2490000\ 20100213\ 300000   \ 20100228
62691169684237\ 081\ 20100216130410\ 수취조회\ 2490000\ 20100213\ 20000000\ 20100201
62691169684237\ 081\ 20100216130410\ 수취조회\ 2490000\ 20100213\ 300000   \ 20100228
62691169684237\ 081\ 20100216120410\ 수취조회\ 2490000\ 20100213\ 600000   \ 20100228
62691169684237\ 081\ 20100216120410\ 수취조회\ 2490000\ 20100213\ 2000000 \ 20100228

위처럼 자료가 테이블에 들어있다고 했을 때
제가 구하고 싶은 것은
쿼리문을 날려서

ACCOUNTNO\bank\ RAISE_TIME\ MSG_TYPE\ RECV_AMT\ RECV_DATE\ NAB_AMT\ NAB_DATE

62691169684237\ 081\ 20100216140510\ 수취조회\ 2490000\ 20100213\ 2490000 \ 20100202
에러원인
62691169684237\ 081\ 20100216130410\ 수취조회\ 2490000\ 20100213\ 300000   \ 20100228
62691169684237\ 081\ 20100216130410\ 수취조회\ 2490000\ 20100213\ 20000000\ 20100201
62691169684237\ 081\ 20100216130410\ 수취조회\ 2490000\ 20100213\ 300000   \ 20100228
에러원인
62691169684237\ 081\ 20100216120410\ 수취조회\ 2490000\ 20100213\ 600000   \ 20100228
62691169684237\ 081\ 20100216120410\ 수취조회\ 2490000\ 20100213\ 2000000 \ 20100228
에러원인


즉, raise_time을 그룹바이로 해서 리스트를 다 보여주면서 raise_time 단위로
에러 원인을 출력하고 싶은 것입니다.

제가 짜본 쿼리는 이렇습니다.

SELECT MAX(VAS_ACCOUNTNO) VAS_ACCOUNTNO
  ,DECODE(SUBSTR(MAX(BANK_CODE), 1, 3), '000', '081', '001', '001', '002', '002', '003', '003',
   '004', '004', '005', '005', '006', '004', '007', '007', '008', '008', '009', '004', '010', '011',
   '011', '011', '012', '012', '013', '012', '014', '012', '015', '012', '016', '011', '017', '011',
   '019', '004', '020', '020', '021', '026', '022', '020', '023', '023', '024', '020', '025', '081',
   '026', '026', '027', '053', '028', '026', '029', '004', '030', '004', '031', '031', '032', '032',
   '033', '081', '034', '034', '035', '035', '036', '053', '037', '037', '038', '026', '039', '039',
   '040', '026', '045', '045', '046', '045', '048', '048', '049', '048', '050', '050', '053', '053',
   '071', '071', '072', '071', '073', '071', '074', '071', '075', '071', '081', '081', '082', '081',
   '083', '020', '084', '020', '085', '045', '086', '045', '088', '026',    
   '081') SUNAPGIGWAN   
  ,MAX(RAISE_TIME) RAISE_TIME   
  ,CASE WHEN MAX(MSG_TYPE) IN ('02001000', '02004100') THEN '수취조회'  
    WHEN MAX(MSG_TYPE) IN ('02001100', '02005100') THEN '계좌입금'  
    ELSE MAX(MSG_TYPE)  
    END MSG_TYPE    
  ,MAX(RECV_AMT) RECV_AMT   
  ,MAX(RECV_DATE) RECV_DATE
  ,MAX(BANK_CODE) BANK_CODE
  ,NAB_AMT  
  ,MIN(NAB_DATE) NAB_DATE   
  ,SUM(NAB_AMT) TOT_AMT
  ,CASE WHEN SUM(NAB_AMT) <> TO_CHAR(MAX(RECV_AMT)) THEN 'ERR_AMT'  
    ELSE TO_CHAR(MAX(RECV_AMT))
    END COMPARE_AMT
  ,CASE WHEN MIN(NAB_DATE) <> '00000000'    
AND MIN(NAB_DATE) < MAX(RECV_DATE) THEN 'ERR_DATE'
    ELSE MAX(RECV_DATE)
    END COMPARE_DATE    
  FROM RECP_ERR_TAB
 WHERE TAX_DIV = '01'   
   AND RECV_DATE BETWEEN '20100213' AND '20100217'  
AND VAS_ACCOUNTNO = '62691169684237'    
 GROUP BY CUBE(NAB_AMT), RAISE_TIME
 ORDER BY RAISE_TIME, NAB_AMT


이렇게 했는데 금액이 같은 건 하나로 합쳐져서 중복된 300000원 건이 출력이 안되더군요.
jsp에서는 위의 에러원인에서 
nab_amt가 널이면 리스트에 에러원인을 출력해서
compare_date 값이 err_date 이거나 compare_amt값이 err_amt 이면 에러문구를 
뿌리는 식으로 처리할려고 하는데요.

참고로 저 테이블엔 은행과의 통신 전문 중에서 오류건만 인서트 되고 있으며
nap_amt나 nap_date는 같은 값이 들어가는 경우가 있습니다.
그래서 그룹바이를 raise_time말고도 어느 하나 맞추기에도 참 애매하네요.
고수님들이 해결방안을 제시해주시면 감사하겠습니다.
편안한 저녁 되십시오.


by 마농 [2010.02.17 23:04:31]
행을 구분하는 항목으로는 primary key 가 있구요, 그밖에 rowid, rownum 등이 있죠.

SELECT NVL(accountno, '에러원인') accountno
, bank
, DECODE(GROUPING(accountno), 0, raise_time) raise_time
, msg_type, recv_amt, recv_date, nab_amt, nab_date
FROM recp_err_tab
GROUP BY raise_time
, ROLLUP((ROWNUM, accountno, bank, msg_type, recv_amt, recv_date, nab_amt, nab_date))
;

by 마농 [2010.02.18 08:26:21]
bank 항목은 코드테이블로 따로 관리하시는것이 좋을듯 하네요.
Decode가 너무 기네요.

by 볼우물 [2010.02.18 15:58:57]
primary key는 없는 테이블입니다. ㅎ 로우넘이 있었네요. 마농님 감사합니다.
좋은 공부가 되었습니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입