PL SQL рекурсивный запрос - PullRequest
       1

PL SQL рекурсивный запрос

2 голосов
/ 01 августа 2011

Ниже приведены таблицы

EVENT table
event_id | gross_amount | transaction_id 
1        | 10           | 1             
2        | 12           | 5   

TRANSACTION table
trx_id | debit | credit | type         | original_trx_id |    last_updated
1      | 0     | 0      | payment      |      null       |    25-JUL-11
2      | 0     | 2      | settlement   |        1        |    26-JUL-11
3      | 0     | 1      | settlement   |        1        |    27-JUL-11
4      | 3     | 0      | settlement   |        1        |    28-JUL-11
5      | 0     | 0      | payment      |      null       |    24-JUL-11
6      | 0     | 3      | settlement   |        5        |    25-JUL-11

RESULT EXPECTED:
trx_id | debit | credit | current_gross | current_net
2      | 0     | 2      | 10            | 12
3      | 0     | 1      | 12            | 13
4      | 3     | 0      | 12            |  9
6      | 0     | 3      | 10            | 13

Пояснение

Транзакция 1,2,3,4 попадает в один набор, а транзакция 5,6 попадает в другой набор.Каждый набор транзакций можно заказать с использованием последнего обновленного столбца.

Для расчета мы не берем тип транзакции «оплата».Транзакция «платеж» связана с таблицей событий.Откуда можно найти "original_gorss_amount" для расчета.

Шаги

  1. Найти таблицу транзакций платежной транзакции из таблицы транзакций.(Пример: транзакция_ид = 1, также из этого мы можем найти original_gross_amount = 10)
  2. Взять все транзакции "урегулирования", для которых original_trx_id = 1
  3. Заказать их на основе времени последнего обновления.
  4. Примените расчет

Надеюсь, вы поняли мой вопрос.Я хочу как-то получить «ОЖИДАЕМЫЙ РЕЗУЛЬТАТ», используя PL SQL (Пожалуйста, не настраивайте функцию)

Я не могу придумать, как применить CONNECT BY здесь.Мы очень ценим вашу помощь.

Ниже вы найдете таблицу и вставьте операторы.

create table event
(event_id   number(9),
 gross_amount number(9),
 transaction_id number(9) );

 insert into event values (1,10,1);
 insert into event values (2,10,5);

 create table transaction
 (trx_id number(9),
  debit  number(9),
  credit number(9),
  type varchar2(50),
  original_trx_id number(9),
  last_updated DATE 
  );

insert into transaction values (1,0,0,'payment',null,'2011-07-25');
insert into transaction values (2,0,2,'settlement',1,'2011-07-26');
insert into transaction values (3,0,1,'settlement',1,'2011-07-27');
insert into transaction values (4,3,0,'settlement',1,'2011-07-28');
insert into transaction values (5,0,0,'payment',null,'2011-07-24');
insert into transaction values (6,0,3,'settlement',5,'2011-07-25');

1 Ответ

1 голос
/ 02 августа 2011

Если я правильно понял ваш вопрос, вам не нужен иерархический или рекурсивный запрос.Просто аналитическая сумма с предложением оконной обработки.

SELECT  T1.trx_id
    ,   T1.debit
    ,   T1.credit
    ,   E2.gross_amount
        + NVL( SUM( T1.credit ) OVER( PARTITION BY T1.original_trx_id
                                 ORDER BY T1.last_updated
                                 RANGE BETWEEN UNBOUNDED PRECEDING
                                            AND 1 PRECEDING ), 0 )
        - NVL( SUM( T1.debit ) OVER( PARTITION BY T1.original_trx_id
                                 ORDER BY T1.last_updated
                                 RANGE BETWEEN UNBOUNDED PRECEDING
                                            AND 1 PRECEDING ), 0 )
                                AS current_gross
    ,   E2.gross_amount
        + SUM( T1.credit ) OVER( PARTITION BY T1.original_trx_id
                                 ORDER BY T1.last_updated
                                 RANGE BETWEEN UNBOUNDED PRECEDING
                                            AND CURRENT ROW )
        - SUM( T1.debit ) OVER( PARTITION BY T1.original_trx_id
                                 ORDER BY T1.last_updated
                                 RANGE BETWEEN UNBOUNDED PRECEDING
                                            AND CURRENT ROW )
                                AS current_net
FROM    g1_transaction  T1
    ,   g1_event        E2
WHERE   T1.original_trx_id  = E2.transaction_id
ORDER BY T1.original_trx_id, T1.last_updated

ПРИМЕЧАНИЕ. Несколько проблем в вашем вопросе (или, по крайней мере, мое понимание этого).

  • Если вторая вставкав events установите значение gross_amount равным 12
  • Если значение current_gross trx_id 4 в результатах равно 13 (вместо 12), поскольку оно включает в себя 1 кредит из trx_id 3. И, таким образом, чистая должна быть 10 (вместо 9)
  • Если значение current_gross в trx_id 6 равно 12 (вместо 10), поскольку это значение gross_amount для события 2. И, таким образом, current_net будет равно 15 (вместо 13)

Если эти предположения верны, то приведенный мною запрос дает эти результаты.

    TRX_ID      DEBIT     CREDIT CURRENT_GROSS CURRENT_NET
---------- ---------- ---------- ------------- -----------
         2          0          2            10          12
         3          0          1            12          13
         4          3          0            13          10
         6          0          3            12          15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...