Я пытаюсь сгенерировать отчет о "кассовой задержке" из готовой финансовой системы. У меня есть доступ к базе данных (Oracle). В отчете должны применяться кредиты к дебетам, первым по возрасту, и рассчитываться разница в днях между моментом создания счета и получения платежа. Все дебеты и кредиты хранятся в одном столбце таблицы финансовых транзакций. Применимые столбцы:
Column Name Type
----------- -------------
AMOUNT NUMERIC(15,2) --debits are positive, credits are negative
FT_ID CHAR(10)
ACCOUNT_ID CHAR(10)
ACCEPTED_DT DATETIME
Таким образом, для таблицы, как:
ACCOUNT_ID FT_ID AMOUNT ACCEPTED_DT
---------------------------------------
1 12345 100.00 12/01/2011
1 12346 -75.00 12/11/2011
1 12347 100.00 12/12/2011
1 12348 -50.00 12/16/2011
Я хотел бы получить обратно что-то вроде следующего ( edit: обновлено для отображения примененных сумм. Я хочу получить реальную сумму кредита, но ее можно найти на основе FT ID для кредита ):
ACCOUNT_ID DEBIT_ID DEBIT_AMOUNT CREDIT_ID CREDIT_AMOUNT AGE
------------------------------------------------------------------
1 12345 75.00 12346 -75.00 10
1 12345 25.00 12348 -25.00 15
1 12347 25.00 12348 -25.00 4
1 12347 75.00 NULL NULL NULL
РЕДАКТИРОВАТЬ : прелесть стандартной системы, которую выбрала моя компания, заключается в том, что платежное приложение настраивается, то есть нет прямой связи кредита с дебетом. Сначала мы применяем денежные средства к самому старому долгу, что я и пытался показать в примере. Первый платеж полностью применяется к самой старой задолженности. Второй платеж распределяется между самым старым и вторым самым старым долгом. Это продолжается до тех пор, пока не будут применены все кредиты.
РЕДАКТИРОВАТЬ 2 : извините, мне кажется, что это трудно объяснить :) Глядя на данные примера, FT 12346 полностью относится к FT 12345, оставляя 25 долларов долга на счете. Следующий платеж будет также применяться к этому долгу, а любая оставшаяся сумма будет применена к следующему самому старому долгу. Промежуточный итог не совсем соответствует тому, что я пытаюсь выполнить, потому что мне нужно знать, сколько лет каждому «срезу» матча:
РЕДАКТИРОВАТЬ 3 : Таблица выше не совсем ясна, извините. Я обновил таблицу.
Debits Credits
+-----------------------+-------------------------+
| FT 12345 | FT 12346 |
| | |
| $100.00 | $75.00 |
| | |
| | |
| | |
| | |
| | |
| | |
| +-------------------------+
| | FT 12348 |
| | $50.00 |
| | +----->$25.00 towards 12345
+-----------------------|.........................|
| FT 12347 | |
| | +----->$25.00 towards 12347
| $100.00 +-------------------------+
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
+-----------------------+-------------------------+
У нас есть решение для этой работы с курсором, но по всей таблице финансовых транзакций (~ 50 м строк) это очень медленно. Мне интересно, есть ли способ переформулировать проблему в терминах чистых таблиц, чтобы ускорить это. Я нашел рецепт для генерации текущего баланса , который кажется началом, но я не уверен, куда идти.