2013-12-18 6 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.

. 
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

В вашем случае, если вы используете запрос для формирования списка дат, которые вы разбиваете внешнее соединение к столу книги. Разделение по расшифровке и присоединение к дате. Это приведет к уплотнению данных, и вы примените функции окна, чтобы выполнить вычисление поверх этого.

  1. Напишите запрос, который возвращает только код, дату и общую сумму транзакции и поместит ее в общее табличное выражение (предложение WITH) с именем cte_transactions.
  2. Написать запрос, который возвращает список дат в КТР, названные cte_dates
  3. присоединиться к ним в другом КТР, используя синтаксис присоединения: от cte_dates d левого внешнего соединения cte_transactions т раздела, (oowncode) на (d.transaction_date = t.transaction_date
  4. Нанести положение окна, чтобы вычислить текущую сумму.
+0

Привет Дэвид спасибо за ваше руководство, но каким-то образом им удалось сделать то же самое могли бы вы предоставить мне запрос, спасибо заранее – user3064554

+0

могли бы вы помочь меня относительно недостающих дат и общего количества – user3064554

Смежные вопросы