2013-12-18 2 views
1

전체 회계 연도의 재무 잔액에 대한이자를 계산하고 싶습니다. 원장 테이블에 엔트리가있을 때 특정 일자에 대한 잔액을 얻을 수 있지만, 엔트리가 없을 때는 내이자 계산이 엉망이됩니다. 1303.87의 균형이 실행, 이제 논리적으로이자 계산을위한 누계 계산

Clientcode   Date   Ledger   Running   BalanceInterest 
00100VS055   01/04/2013  1303.87  1303.87  64.3 
00100VS055   15/05/2013  337.08  1640.95   80.92 

: 결과 아래

Select ledger.oowncode as "Clientcode", 
    to_char(ledger.dtoftran, 'DD/MM/YYYY') as "Date", 
    sum(ledger.damount - ledger.camount) as "Ledger", 
    Sum(Sum(Ledger.Damount - Ledger.Camount)) over(Partition by Ledger.Oowncode Order by    Ledger.Oowncode,ledger.dtoftran rows between unbounded preceding and current row) as "Running Balance", 
    round((Sum(Sum(Ledger.Damount - Ledger.Camount)) over(Partition by Ledger.Oowncode Order by Ledger.Oowncode,ledger.dtoftran rows between unbounded preceding and current row)*18/365),2) as "Interest" 
    from ledger ledger 
where ledger.firmnumber = 'SUG-000001' 
    and ledger.oowncode = '00100VS055' 
    and ledger.dtoftran >='01-APR-2013' 
    and ledger.dtoftran <='31-MAY-2013' 
group by ledger.oowncode, ledger.dtoftran 

된다 : 아래

OOWNCODE  DTOFTRAN  VOUCHER   DRCR  DAMOUNT  CAMOUNT 
00100VS055  04/01/2013 OPNG001NSE0  Debit  1303.87 0.00 
00100VS055  05/15/2013 JVOFSET0000025 Debit  337.08  0.00 

실행 원장 균형 쿼리입니다 : 다음은 원장 테이블입니다 2013 년 5 월 15 일까지 매일 매일의 잔고를 계산 한 다음 1640.95는 다음날의 잔고입니다. 나는 결과는 다음과 같이 할 것을 권장합니다

Clientcode Date Ledger Running Balance Interest 
00100VS055 01/04/2013 1303.87 1303.87 64.3 
00100VS055 02/04/2013 1303.87 1303.87 64.3 
00100VS055 03/04/2013 1303.87 1303.87 64.3 
00100VS055 04/04/2013 1303.87 1303.87 64.3 

등 최대 전까지 15

. 
00100VS055 15/05/2013 337.08 1640.95 80.92 

2013 년은 당신이 나를이 땅에 도움을 주시기 바랍니다 수 있습니다? 출력 아래

WITH l AS 
(SELECT oowncode,dtoftran,damount,camount from ledger 
WHERE firmnumber='DDA-000001' and oowncode='ACCOPEN' 
GROUP BY oowncode,dtoftran,damount,camount) 
Select l.oowncode,cte_dates.dtoftran,sum(l.damount-l.camount) running 
From (SELECT dtoftran 
FROM ledger 
WHERE dtoftran BETWEEN 
TO_DATE('01/04/2011', 'DD/MM/YY') 
AND TO_DATE('31/03/2012', 'DD/MM/YY') group by dtoftran) cte_dates 
left outer join l 
partition by (oowncode) on (cte_dates.dtoftran = l.dtoftran) 
group by l.oowncode,cte_dates.dtoftran 

그리고있다 :

1 ACCOPEN  01/04/2011 12350 
2 ACCOPEN  02/04/2011 
3 ACCOPEN  04/04/2011 
4 ACCOPEN  05/04/2011 
5 ACCOPEN  06/04/2011 
6 ACCOPEN  07/04/2011 2600 
7 ACCOPEN  08/04/2011 -650 
8 ACCOPEN  09/04/2011 
9 ACCOPEN  11/04/2011 
10 ACCOPEN  12/04/2011 
11 ACCOPEN  13/04/2011 650 
12 ACCOPEN  14/04/2011 
13 ACCOPEN  15/04/2011 9100 
14 ACCOPEN  16/04/2011  

나는 심지어 02/04에서 원하는을


안녕하세요 데이비드,
당신의 도움이 당으로 내가 필요한 코딩을 수행 한/2011 그것은 windowing 절의 누계를 가져와야합니다. 내가 어디에서 잘못했는지 안내해 줄 수 있니?

답변

2

이것은 데이터 밀도 문제로, Ledger.Oowncode 및 ledger.dtoftran의 모든 값에 대해 가능한 모든 값 (해당되는 경우)에 대한 레코드가 있는지 확인해야합니다. 귀하의 경우에는 http://docs.oracle.com/cd/B19306_01/server.102/b14223/analysis.htm#i1014934

당신이 외부 장부 테이블에 가입 분할 날짜의 목록을 생성하는 쿼리를 사용 :

오라클 10g는 파티션은 정확히 이러한 목적을 위해 조인 구문을 가지고있다. oowncode로 파티션하고 날짜에 참여하십시오. 그러면 데이터가 고밀도화되고 창 함수를 적용하여 계산을 수행합니다.

  1. 코드, 날짜 및 총 거래 금액을 반환하는 쿼리를 작성하고 cte_transactions라는 공통 테이블 식 (WITH 절)에 넣습니다.
  2. 는 CTE에 날짜 목록을 반환하는 쿼리,
  3. 이 (가) 조인 구문을 사용하여 다른 CTE에 그들을 참여라는 이름의 cte_dates 쓰기 : cte_dates 왼쪽 바깥을 거라고에서 d.transaction_date = (에 (oowncode)에 의해 cte_transactions의 t 파티션 가입
  4. 가 누적 합계를 계산하는 창 절을 적용 t.transaction_date.
+0

안녕 다윗 당신의 지침을 주셔서 감사합니다,하지만 어떻게 든 당신이 나에게 쿼리를 제공 할 수있는 동일한 작업을 수행 할 수없는 메신저, 사전에 감사 – user3064554

+0

당신이 도움이 될 수 누락 된 날짜와 누계에 관한 나 – user3064554