Поиск дат, когда счета достигают нуля - PullRequest
1 голос
/ 10 февраля 2012

Спасибо, что нашли время изучить мою проблему.

Я пытаюсь найти способ вернуть даты, когда учетная запись достигает 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 ]

5 голосов
/ 10 февраля 2012

Вы можете использовать аналитические функции для вычисления текущего баланса

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
0 голосов
/ 11 февраля 2012
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 
*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...