powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Статистика по оплатам - нужна помощь в построении запроса
7 сообщений из 7, страница 1 из 1
Статистика по оплатам - нужна помощь в построении запроса
    #39559067
Антон83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Есть Поставщики Услуг PU_id, у каждого задолженности BID. ПУ может оплатить частями PAY_ID с суммой PAYSUM.
Нужно построить запрос, выдающий статистику по динамике оплат, с учётом накопления суммы платежей/суммы остатка к оплате
SUM_NAK/SUM_OST. Пример сведён к абстракции.

Пока только такое решение, но корявое. Подмывает сделать group by rollup и в 1 заход, но не получилось.
Прошу помочь с красивым решением, спасибо!

with D as--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(
select 1 as PU_id,1 as PAY_ID,10 as BID,2 as PAYSUM from dual
union all
select 1,2,10,3 from dual
union all
select 1,3,10,5 from dual
union all
select 2,1,20,3 from dual
union all
select 2,2,20,17 from dual
union all
select 3,3,30,1 from dual
union all
select 3,4,30,7 from dual
union all
select 4,1,40,0 from dual
) --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select D.PU_id,D.PAY_ID,D.BID,D.PAYSUM,sum(D.PAYSUM) over (partition by D.PU_id order by D.PU_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) SUM_NAK,
D.BID-sum(D.PAYSUM) over (partition by D.PU_id order by D.PU_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) SUM_OST
from D
group by D.PU_id,D.PAY_ID,D.BID,D.PAYSUM

union all

select D.PU_id,null,D.BID,sum(D.PAYSUM),sum(D.PAYSUM),D.BID-sum(D.PAYSUM)
from D
group by D.PU_id,D.BID

union all

select null,null,sum(D.BID),sum(D.PAYSUM),sum(D.PAYSUM),sum(D.BID)-sum(D.PAYSUM) from
(select D.PU_id,D.BID,sum(D.PAYSUM) PAYSUM,sum(D.PAYSUM) ,D.BID-sum(D.PAYSUM)
from D
group by D.PU_id,D.BID )D

order by 1,2
...
Рейтинг: 0 / 0
Статистика по оплатам - нужна помощь в построении запроса
    #39559121
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй тэг SRC, быстрее ответят

Антон83
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
with D as--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(
select 1 as PU_id,1 as PAY_ID,10 as BID,2 as PAYSUM from dual
union all
select 1,2,10,3 from dual
union all
select 1,3,10,5 from dual
union all
select 2,1,20,3 from dual
union all
select 2,2,20,17 from dual
union all
select 3,3,30,1 from dual
union all
select 3,4,30,7 from dual
union all
select 4,1,40,0 from dual
)        --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select D.PU_id,D.PAY_ID,D.BID,D.PAYSUM,sum(D.PAYSUM) over (partition by D.PU_id order by D.PU_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) SUM_NAK,
 D.BID-sum(D.PAYSUM) over (partition by D.PU_id order by D.PU_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) SUM_OST
 from D
group by D.PU_id,D.PAY_ID,D.BID,D.PAYSUM

union all

select D.PU_id,null,D.BID,sum(D.PAYSUM),sum(D.PAYSUM),D.BID-sum(D.PAYSUM)
 from D
 group by D.PU_id,D.BID
 
union all

select null,null,sum(D.BID),sum(D.PAYSUM),sum(D.PAYSUM),sum(D.BID)-sum(D.PAYSUM) from
(select D.PU_id,D.BID,sum(D.PAYSUM) PAYSUM,sum(D.PAYSUM) ,D.BID-sum(D.PAYSUM)
 from D
 group by D.PU_id,D.BID )D
 
 order by 1,2
...
Рейтинг: 0 / 0
Статистика по оплатам - нужна помощь в построении запроса
    #39559199
Антон83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
О, спасибо! Редактировать сообщения похоже нельзя.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
with D as--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(
select 1 as PU_id,1 as PAY_ID,10 as BID,2 as PAYSUM from dual
union all
select 1,2,10,3 from dual
union all
select 1,3,10,5 from dual
union all
select 2,1,20,3 from dual
union all
select 2,2,20,17 from dual
union all
select 3,3,30,1 from dual
union all
select 3,4,30,7 from dual
union all
select 4,1,40,0 from dual
)        --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select D.PU_id,D.PAY_ID,D.BID,D.PAYSUM,sum(D.PAYSUM) over (partition by D.PU_id order by D.PU_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) SUM_NAK,
 D.BID-sum(D.PAYSUM) over (partition by D.PU_id order by D.PU_id ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) SUM_OST
 from D
group by D.PU_id,D.PAY_ID,D.BID,D.PAYSUM

union all

select D.PU_id,null,D.BID,sum(D.PAYSUM),sum(D.PAYSUM),D.BID-sum(D.PAYSUM)
 from D
 group by D.PU_id,D.BID
 
union all

select null,null,sum(D.BID),sum(D.PAYSUM),sum(D.PAYSUM),sum(D.BID)-sum(D.PAYSUM) from
(select D.PU_id,D.BID,sum(D.PAYSUM) PAYSUM,sum(D.PAYSUM) ,D.BID-sum(D.PAYSUM)
 from D
 group by D.PU_id,D.BID )D
 
 order by 1,2



Жду идей.
...
Рейтинг: 0 / 0
Статистика по оплатам - нужна помощь в построении запроса
    #39559274
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антон83Жду идей.
Вам бы с постановкой разобраться - кто на ком стоял и кем погонял.
Впрочем, каков вопрос (получить на указанном наборе результат, идентичный представленному посредством rollup) - таков и ответ:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
with D as--~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(         select 1 as PU_id,1 as PAY_ID,10 as BID,2 as PAYSUM from dual
union all select 1, 2, 10, 3 from dual
union all select 1, 3, 10, 5 from dual
union all select 2, 1, 20, 3 from dual
union all select 2, 2, 20,17 from dual
union all select 3, 3, 30, 1 from dual
union all select 3, 4, 30, 7 from dual
union all select 4, 1, 40, 0 from dual
) --~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
select PU_id, PAY_ID
     , decode( grouping_id(pu_id,pay_id)
             , 0, sum(bid)
             , sum(decode(rno,1,BID,null))) BID
     , sum(PAYSUM) PAYSUM
     , decode( grouping_id(pu_id,pay_id)
             , 3, sum(paysum)
             , max(SUM_NAK)
             ) SUM_NAK
     , decode( grouping_id(pu_id,pay_id)
             , 3, sum(decode(rno,1,BID,null))-sum(paysum)
             , min(SUM_OST)
             ) SUM_OST
from(   select D.PU_id,D.PAY_ID,D.BID,D.PAYSUM
             , sum(D.PAYSUM) over (partition by D.PU_id order by D.PAY_id) SUM_NAK
             , D.BID-sum(D.PAYSUM) over (partition by D.PU_id order by D.PAY_id) SUM_OST
             , row_number() over (partition by D.PU_id order by D.PAY_id desc) rno
        from D)
group by rollup (PU_id, PAY_ID)
order by PU_id, PAY_ID
...
Рейтинг: 0 / 0
Статистика по оплатам - нужна помощь в построении запроса
    #39559292
Антон83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous,

Спасибо за ответ! Что именно не так с постановкой? Сортировка по возрастанию PU_id и PAY_ID, итоги не в приоритете. В реальной задаче PAY_ID могут совпадать (это не имеет значения, т.к. весь пул оплат от одного ПУ может быть в одном трансфере и для построения буду использовать ID записей трансфера в этом случае). Или в идеале нужны чёткие критерии по всем столбцам и описание модели?

Какое наиболее оптимальное решение по Вашему мнению ( опять же в рамках абстракции)?
...
Рейтинг: 0 / 0
Статистика по оплатам - нужна помощь в построении запроса
    #39559321
K790
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антон83,

авторв рамках абстракции
вы конкретизируйте, что именно у Вас не получается, кто или что у Вас пропадает.
...
Рейтинг: 0 / 0
Статистика по оплатам - нужна помощь в построении запроса
    #39559372
Антон83
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
K790,
Всё получается, оба скрипта (моё решение и решение andrey_anonymous) работают на отлично, ничего нигде не пропадает. Но нет уверенности в оптимальности, возможно я зря внимание на rollup акцентировал. Хотелось бы ещё идей по реализации, к тому же я пока слабо владею аналитическими функциями.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Статистика по оплатам - нужна помощь в построении запроса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]