【问题标题】:PL SQL Recursive QueryPL SQL 递归查询
【发布时间】:2023-03-11 10:03:01
【问题描述】:

请查看下表

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. 从交易表中查找事件表支付交易。 (例如:transaction_id = 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');

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

如果我理解你的问题是正确的,你不想要分层或递归查询。只是一个带有窗口子句的分析和。

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
  • 结果中 trx_id 4 的 current_gross 是否应为 13(而不是 12),因为它包括来自 trx_id 3 的 1 个学分。因此净值应为 10(而不是 9)
  • trx_id 6 的 current_gross 是否应该是 12(而不是 10),因为这是事件 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

【讨论】:

  • 是的,你提到的问题很少,应该是正确的。您在注释中正确地提到了它。谢谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-11-27
  • 2015-07-13
  • 2014-12-19
  • 2012-12-05
  • 2016-01-25
相关资源
最近更新 更多