查找帐户达到零时的日期

时间:2012-02-10 15:11:17

标签: sql oracle oracle10g

感谢您抽出宝贵时间来研究我的问题。

我正试图想办法在帐户达到0时返回日期

示例数据:

DATE      ACCOUNT  AMOUNT
11/01     001        100
11/02     002         50
11/03     001       -100 
11/07     001         20
11/15     002        -50
11/20     001        -20

通缉结果:

Account   ZeroDate
001       11/03
002       11/15
001       11/20

到目前为止,我还没弄清楚任何可行的方法。你能指出我正确的方向吗?

提前再次感谢!

2 个答案:

答案 0 :(得分:5)

您可以使用分析函数计算运行余额

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select date '2011-11-01' dt, 1 account, 100 amt from dual union all
  3    select date '2011-11-02', 2, 50 from dual union all
  4    select date '2011-11-03', 1, -100 from dual union all
  5    select date '2011-11-07', 1, 20 from dual union all
  6    select date '2011-11-15', 2, -50 from dual union all
  7    select date '2011-11-20', 1, -20 from dual
  8  )
  9  select dt,
 10         account,
 11         amt,
 12         sum(amt) over (partition by account order by dt) current_balance
 13*   from x
SQL> /

DT           ACCOUNT        AMT CURRENT_BALANCE
--------- ---------- ---------- ---------------
01-NOV-11          1        100             100
03-NOV-11          1       -100               0
07-NOV-11          1         20              20
20-NOV-11          1        -20               0
02-NOV-11          2         50              50
15-NOV-11          2        -50               0

6 rows selected.

然后使用运行余额查找零日期。

SQL> ed
Wrote file afiedt.buf

  1  with x as (
  2    select date '2011-11-01' dt, 1 account, 100 amt from dual union all
  3    select date '2011-11-02', 2, 50 from dual union all
  4    select date '2011-11-03', 1, -100 from dual union all
  5    select date '2011-11-07', 1, 20 from dual union all
  6    select date '2011-11-15', 2, -50 from dual union all
  7    select date '2011-11-20', 1, -20 from dual
  8  )
  9  select account,
 10         dt zero_date
 11    from (
 12      select dt,
 13             account,
 14             amt,
 15             sum(amt) over (partition by account order by dt) current_balance
 16        from x
 17    )
 18*  where current_balance = 0
SQL> /

   ACCOUNT ZERO_DATE
---------- ---------
         1 03-NOV-11
         1 20-NOV-11
         2 15-NOV-11

答案 1 :(得分:0)

create table myacct (dt varchar2(5)
, account varchar2(3)
, amount number
)
;

insert into myacct values ('11/01',     '001',        100);
insert into myacct values ('11/02',     '002',         50);
insert into myacct values ('11/03',     '001',       -100);
insert into myacct values ('11/07',     '001',         20);
insert into myacct values ('11/15',     '002',        -50);
insert into myacct values ('11/20',     '001',        -20);

commit;

/* results wanted:
Account   ZeroDate 
001       11/03 
002       11/15 
001       11/20 */

select account "Account", dt "ZeroDate" 
from myacct
where amount <= 0
;

/* results from above query: 
Account ZeroDate 
001 11/03 
002 11/15 
001 11/20 
*/