Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Нарастающий итог, где-то ошибка (+)  [new]
Новичок_я
Member

Откуда:
Сообщений: 228
Всем привет!
with testtable as
(
select to_date('28.02.2010', 'dd.mm.yyyy') as dt, '-1' as payer, -3082662 as amount from dual
union all
select to_date('30.04.2010', 'dd.mm.yyyy') as dt, 'Плательщик 1',	367212581 amount from dual
union all
select to_date('31.05.2010', 'dd.mm.yyyy') as dt, 'Плательщик 2',	-142314457 as amount from dual
union all
select to_date('30.04.2010', 'dd.mm.yyyy') as dt, 'Плательщик 2',	-1336542095 as amount from dual
union all
select to_date('31.03.2010', 'dd.mm.yyyy') as dt, 'Плательщик 1',	377971298 as amount from dual
union all
select to_date('31.05.2010', 'dd.mm.yyyy') as dt, '-1',	-746652 as amount from dual
union all
select to_date('31.03.2010', 'dd.mm.yyyy') as dt, 'Плательщик 3',	-80800 as amount from dual
union all
select to_date('31.05.2010', 'dd.mm.yyyy') as dt, 'Плательщик 3',	-753000 as amount from dual
union all
select to_date('31.03.2010', 'dd.mm.yyyy') as dt, 'Плательщик 2',	-400224650 as amount from dual
union all
select to_date('28.02.2010', 'dd.mm.yyyy') as dt, 'Плательщик 2',	-388795572 as amount from dual
union all
select to_date('30.04.2010', 'dd.mm.yyyy') as dt, 'Плательщик 3',	-1205739 as amount from dual
union all
select to_date('30.04.2010', 'dd.mm.yyyy') as dt, '-1',	-8103122 as amount from dual
union all
select to_date('31.03.2010', 'dd.mm.yyyy') as dt, 'Плательщик 4',	-61000 as amount from dual
union all
select to_date('28.02.2010', 'dd.mm.yyyy') as dt, 'Плательщик 3',	-143033 as amount from dual
union all
select to_date('31.05.2010', 'dd.mm.yyyy') as dt, 'Плательщик 1',	112331943 as amount from dual
union all
select to_date('28.02.2010', 'dd.mm.yyyy') as dt, 'Плательщик 1',	317129490 as amount from dual
union all
select to_date('28.02.2010', 'dd.mm.yyyy') as dt, 'Плательщик 4',	-239628 as amount from dual
union all
select to_date('31.03.2010', 'dd.mm.yyyy') as dt, '-1',	-141800 as amount from dual
union all
select to_date('30.04.2010', 'dd.mm.yyyy') as dt, 'Плательщик 4',	-225315 as amount from dual
)
select dt, sum(amount) from
(select t.dt, t.payer, sum(t.amount) over (partition by t.payer order by t.dt) amount
from testtable t
order by t.dt)
where dt = to_date('31.05.2010', 'dd.mm.yyyy')
group by dt

Но если просто сделать сумму всех значений
select sum(amount) from testtable

то получается другое значение. Где я ошибся?
Спасибо!
17 май 10, 09:05    [8782810]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Elic
Member

Откуда:
Сообщений: 29976
Новичок_я
то получается другое значение. Где я ошибся?
А с какой стати им совпадать? :)
Новичок_я
Где я ошибся?
select * 
  from
  ( select t.dt, t.payer, sum(t.amount) over (partition by t.payer order by t.dt) amount
      from testtable t
  )
  where dt = to_date('31.05.2010', 'dd.mm.yyyy')
;
17 май 10, 09:14    [8782841]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Новичок_я
Member

Откуда:
Сообщений: 228
Поясню тогда то, что мне надо получить: есть факт платежей, считается нарастающим итогом в разрезе месяцев (последнее число) и плательщика (payer). В testtable все данные до мая включительно, значит, сумма всех платежей это итог на конец мая. Это считает запрос
select sum(amount) from testtable

Считаю нарастающим итогом сумму платежей по месяца и плательщикам
select t.dt, t.payer, sum(t.amount) over (partition by t.payer order by t.dt) amount
from testtable t
order by t.dt
если сделать из этого запроса выборку за май месяц вот этим запросом
select dt, sum(amount) from
(select t.dt, t.payer, sum(t.amount) over (partition by t.payer order by t.dt) amount
from testtable t
order by t.dt)
where dt = to_date('31.05.2010', 'dd.mm.yyyy')
group by dt


, по моему разумению должна получиться сумма такая же, как и в этом запросе
select sum(amount) from testtable

Либо я недопонимаю логику, либо неверно написал запрос. ПОясните, пожалуйста
17 май 10, 09:23    [8782883]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Dragon Luck
Member

Откуда: Н. Новгород
Сообщений: 79
у 'Плательщик 4' нет итога на to_date('31.05.2010', 'dd.mm.yyyy')

у него итог на to_date('30.05.2010', 'dd.mm.yyyy') это -525943 как раз и есть твоя разница
17 май 10, 09:52    [8783064]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Dragon Luck
Member

Откуда: Н. Новгород
Сообщений: 79
у него итог на 30.04.2010
17 май 10, 09:54    [8783086]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Новичок_я
Member

Откуда:
Сообщений: 228
Вот теперь ясно. Спасибо!!!
17 май 10, 09:57    [8783108]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Просто интересно, а зачем Вам сортировка во внутреннем подзапросе?
Ну и вообще-то сравнивать стоит с запросом:
select sum(amount) from testtable where dt =< to_date('31.05.2010', 'dd.mm.yyyy')
17 май 10, 10:09    [8783186]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Новичок_я
Member

Откуда:
Сообщений: 228
Сортировка всего лишь для удобства :-)
17 май 10, 10:14    [8783217]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Новичок_я
Member

Откуда:
Сообщений: 228
Тогда попутно вопрос: если оборотов за месяц по плательщику не было, как сделать, чтобы сумма на конец этого месяца была равна сумме на конец предыдущего месяца (текущий_остаток = предыдущий_остаток + 0). Только через объединение со справочником плательщиков?
17 май 10, 10:16    [8783231]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
Dragon Luck
Member

Откуда: Н. Новгород
Сообщений: 79
Новичок_я,

а чем этот не подходит?

select t.payer, sum(t.amount) 
from testtable t
group by t.payer
17 май 10, 11:21    [8783743]     Ответить | Цитировать Сообщить модератору
 Re: Нарастающий итог, где-то ошибка (+)  [new]
JaRo
Member

Откуда:
Сообщений: 1659
Новичок_я
Сортировка всего лишь для удобства :-)
Чьего, простите?...

Новичок_я
Только через объединение со справочником плательщиков?
Ну да. Если записи нет, то её надо откуда-то взять. Хотя всё зависит от ответа на вопрос - интересует ли Вас запись по платедьщику, по которому вообще ничего ещё не было? Если нет, то можно в принципе и без справочника обойтись.
17 май 10, 11:41    [8783915]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить