【问题标题】:getting previous balance before transaction date in ORACLE在 ORACLE 中获取交易日期之前的上一个余额
【发布时间】:2017-08-16 20:45:01
【问题描述】:

我有一张这样的表(交易)

ID   | Name  |   Unit  |Quantity_in|Quantity_out|transaction_date|
-----|-------| --------|-----------|------------|----------------|
100  |  aaaa |  packet |  100      |    0       |     02/07/2017 |
99   |  cccc |  packet |  70       |    0       |     20/06/2017 |
99   |  cccc |  packet |  0        |    20      |     22/07/2017 |
100  |  aaaa |  strip  |   0       |    30      |     05/07/2017 |
102  |  bbbb |  packet |  50       |    0       |     29/06/2017 |

我想进行查询以获取两天之间的交易和当前余额,同时获取 WHERE 条件中日期之前的先前余额,因此我进行以下查询

select d.ID, d.Name, d.Unit, (select sum(tr.Quantity_in)- sum(tr.Quantity_out) from transactions tr where tr.transaction_date 作为 Prev_bal,sum(d.Quantity_in), sum(d.Quantity_out), Prev_bal +(sum(d.Quantity_in)- sum(d.Quantity_out)) 作为 current_balance from交易d 其中 d.transaction_date 介于 01/07/2017 和 30/07/2017 之间 按 d.ID、d.Name、d.Unit 分组

但是下面的查询结果没有包含ID 102,因为Where条件中的日期之间没有交易

ID  | Name | Unit   | Prev_bal | Quantity_in |  Quantity_out |Current_balance|
----|------| ------ |----------|-------------|---------------|---------------|    
100 |aaaa  |packet  |   0      |  100        |    30         |     70
----|----- |--------|----------|-------------|---------------|---------------|
99  |cccc  |packet  |   70     |  0          |    20         |     50        |

即使 WHERE 条件中的日期之间没有交易(如表中的 ID 102),任何人都可以帮助我进行查询以获取所有具有余额的 ID 的结果。 我需要获取当前余额 (Current_balance),其中两个日期之间的 transaction_date 和前一个余额 (Prev_bal) 的 ID 的余额为 transaction_date

标识 |姓名 |单位 |上一页 |数量_in | Quantity_out |Current_balance|

100 |aaaa |数据包 | 0 | 100 | 30 | 70

99 |cccc |数据包 | 70 | 0 | 20 | 50 |

102 |bbbb |数据包 | 50 | 0 | 0 | 50 |


【问题讨论】:

  • 您需要提供更多详细信息。什么是表“d”?你需要什么输出?您在查询中使用了 SUM,但没有指定任何分组子句。
  • 感谢注释我调整查询以添加总和和 d
  • 对于输出,我需要获取当前余额 (Current_balance),其中 2 个日期之间的 transaction_date 以及具有余额的 ID 的上一个余额 (Prev_bal),其中 transaction_date
  • 如果在您的日期范围之后有交易会发生什么?
  • 没问题,我只需要日期范围内的报告

标签: java oracle


【解决方案1】:

所以,这就是我的想法。

无论您提供的日期范围如何,您仍然希望每个 ID 都包含在结果集中。所以没有必要过滤掉这些行。所以现在的问题是找出一天结束时剩余的余额。因此,对于您的日期范围内的项目,余额是当前余额,对于您的日期范围之前的项目,它的前一个余额(基本上是最后一个当前余额)。 这是在 Oracle 中使用分析函数的查询。

WITH dat
     AS (SELECT 100 AS id,
                'aaaa' AS name,
                'packet' AS unit,
                100 AS quantity_in,
                0 AS quantity_out,
                TO_DATE ('02/07/2017', 'DD/MM/YYYY') AS transaction_date
         FROM   DUAL
         UNION
         SELECT 99 AS id,
                'cccc' AS name,
                'packet' AS unit,
                70 AS quantity_in,
                0 AS quantity_out,
                TO_DATE ('20/06/2017', 'DD/MM/YYYY') AS transaction_date
         FROM   DUAL
         UNION
         SELECT 99 AS id,
                'cccc' AS name,
                'packet' AS unit,
                0 AS quantity_in,
                20 AS quantity_out,
                TO_DATE ('22/07/2017', 'DD/MM/YYYY') AS transaction_date
         FROM   DUAL
         UNION
         SELECT 100 AS id,
                'aaaa' AS name,
                'strip' AS unit,
                0 AS quantity_in,
                30 AS quantity_out,
                TO_DATE ('05/07/2017', 'DD/MM/YYYY') AS transaction_date
         FROM   DUAL
         UNION
         SELECT 102 AS id,
                'bbbb' AS name,
                'packet' AS unit,
                50 AS quantity_in,
                0 AS quantity_out,
                TO_DATE ('29/06/2017', 'DD/MM/YYYY') AS transaction_date
         FROM   DUAL)
SELECT id,
       name,
       unit,
       quantity_in,
       quantity_out,
       transaction_date,
       remaining_balance
FROM   (SELECT id,
               name,
               unit,
               quantity_in,
               quantity_out,
               balance,
               transaction_date,
               SUM (balance)
               OVER (PARTITION BY id ORDER BY transaction_date ROWS UNBOUNDED PRECEDING)
                  AS remaining_balance,
               RANK () OVER (PARTITION BY id ORDER BY transaction_date DESC) AS rn
        FROM   (SELECT id,
                       name,
                       unit,
                       quantity_in,
                       quantity_out,
                       quantity_in
                       - quantity_out
                          AS balance,
                       transaction_date
                FROM   dat))
WHERE  rn = 1;

它会产生这个结果。

ID |NAME|UNIT   |  QUANTITY_IN|QUANTITY_OUT|TRANSACTION_DATE|REMAINING_BALANCE
99 |cccc|packet |            0|          20|       7/22/2017|               50
100|aaaa|strip  |            0|          30|        7/5/2017|               70
102|bbbb|packet |           50|           0|       6/29/2017|               50

【讨论】:

  • 非常感谢您的回复但是如果我有数百个 ID,这意味着我应该为每个 ID 重复选择。上表中的 ID 只是一个示例,并非真实数据。
  • 另外,结果不应该像你的结果。要获得正确的结果,请查看我的帖子,因为我最近在帖子末尾添加了它
  • 您不必为每个 ID 重复选择。该查询将获取表中的所有 ID。
  • 但这并没有给出之前的余额。它只给出交易和当前余额
  • 对于超出您的日期范围的项目,之前的余额与当前的最后余额不一样吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-20
  • 2015-11-09
  • 1970-01-01
  • 2020-08-12
  • 2019-03-28
  • 1970-01-01
  • 2019-06-29
相关资源
最近更新 更多