2013-12-18 213 views
1

我想计算整个财政年度的财务余额利息。在分类账表中有条目时,我可以在特定的日期获得运行余额,但是当没有条目时,我的利息计算就会失灵。下面是分类帐表:计算利息的计算总额

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 

下面是正在运行的分类帐余额查询:

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 

并且在下面的结果:

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 

现在逻辑,运行的1303.87的平衡每天运行余额直到15/05/2013,然后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直到2013年5月

. 
00100VS055 15/05/2013 337.08 1640.95 80.92 

能否请你帮我在这地上?


嗨大卫,
按照您的帮助,我已经做了必要的编码:

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应该引入开窗条款的运行总数。你能指导我,我错在哪里?

回答

2

这是一个数据致密问题,在这个问题中,您需要确保每个可能的值都有记录 - 对于您的情况,对于Ledger.Oowncode和ledger.dtoftran的每个值都有记录。

Oracle 10g中有一个隔板连接语法出于这样的目的:http://docs.oracle.com/cd/B19306_01/server.102/b14223/analysis.htm#i1014934

在你的情况,你使用查询生成日期的列表,你分区外连接到总帐表。由oowncode分区并加入日期。这将使数据更加致密,并且您将应用窗口函数来进行最重要的计算。

  1. 编写一个只返回代码,日期和总交易额的查询,并将其放入名为cte_transactions的公用表表达式(WITH子句)中。
  2. 编写一个查询返回的CTE日期列表,名为cte_dates
  3. 使用联接语法加入他们在另一个CTE:从cte_datesð左外上(d.transaction_date =由(oowncode)加入cte_transactions牛逼分区t.transaction_date
  4. 应用窗口子句来计算运行总和。
+0

嗨大卫感谢您的指导,但不知何故,即时通讯不能做同样的你能提供给我查询,在此先感谢 – user3064554

+0

你能帮忙我关于错过日期和运行总数 – user3064554