powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести положительную сумму на последнюю даты
12 сообщений из 12, страница 1 из 1
Вывести положительную сумму на последнюю даты
    #39799251
o.makarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет,

Не получается никак написать запрос, который будет выводить крайнюю положительную сумму и дату, когда она была начислена.

Исходные данные следующие:
Есть множество аккаунтов, у каждого аккаунта есть начисления в каждом месяце по определённым услугам, например:

Аккаунт 555 имеет начисление 500 на дату 01.01.2019 по услуге 1, начисление 500 на дату 01.02.2019 по услуге 1 и -500 по услуге 2.

То есть в итоге мне нужно получить сумму 500 на 01.01.2019, поскольку сумма на 01.02.2019 будет равна 0.

Поэтому условие where sum > 0 не подходит, условие having sum(sum) > 0, last тоже не подходит, поскольку тогда данный аккаунт будет исключён из итоговой выборки.

Может, кто подскажет, что почитать и как это можно осуществить.

Для конкретного аккаунта запрос работает (приведу ниже). Но для всего списка нет

Вот запрос, который писал я, он работает, только если лайкать по конкретному аккаунту, а не по всем

select distinct
account_number,
data
from (
select
c1.account_number,
trunc(c1.pay_date,'month') data,
sum(c1.sum) summa
from exchange.charge_groups_sd c1
where
c1.account_number = account_number and
c1.account_number like '2000000341779' and
pay_date < to_date('01.03.2019','dd.mm.yyyy')
having
sum(c1.sum) > 0
group by
c1.account_number,
trunc(c1.pay_date,'month')
order by
trunc(c1.pay_date,'month') desc) t
where
data in (select
max(data)
from(
select
c1.account_number,
trunc(c1.pay_date,'month') data,
sum(c1.sum) summa
from exchange.charge_groups_sd c1
where
c1.account_number = account_number and
c1.account_number like '2000000341779' and
pay_date < to_date('01.03.2019','dd.mm.yyyy')
having
sum(c1.sum) > 0
group by
c1.account_number,
trunc(c1.pay_date,'month')
order by
trunc(c1.pay_date,'month') asc) t)
order by
data
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799259
Dshedoo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
with q (acc, amt, dat, serv) as (
select 555, 500, to_date('01.01.2019','DD.MM.YYYY'), 1 from dual union all
select 555, 500, to_date('02.01.2019','DD.MM.YYYY'), 1 from dual union all
select 555, -500, to_date('03.01.2019','DD.MM.YYYY'), 2 from dual union all
select 444, 500, to_date('01.01.2019','DD.MM.YYYY'), 1 from dual union all
select 444, 1500, to_date('02.01.2019','DD.MM.YYYY'), 3 from dual union all
select 444, -500, to_date('03.01.2019','DD.MM.YYYY'), 2 from dual union all
select 111, 500, to_date('01.01.2019','DD.MM.YYYY'), 1 from dual union all
select 111, -500, to_date('02.01.2019','DD.MM.YYYY'), 3 from dual union all
select 111, -500, to_date('03.01.2019','DD.MM.YYYY'), 2 from dual union all
select 111, 500, to_date('14.01.2019','DD.MM.YYYY'), 1 from dual union all
select 111, -500, to_date('15.01.2019','DD.MM.YYYY'), 2 from dual union all
select 111, 750, to_date('17.01.2019','DD.MM.YYYY'), 1 from dual)
, w as (select acc, sum(amt) OVER (partition by acc order by dat) as amt, dat from q)

select * from w where amt > 0 and not exists (select 1 from w w2 where w2.amt > 0 and w2.dat > w.dat and w.acc=w2.acc)
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799260
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты ведь уже спрашивал .
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799265
o.makarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

да, спасибо за ответ, но через last у меня ничего не получилось, ну или просто я туплю и не могу понять, как им грамотно пользоваться
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799269
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o.makarov,

Давай подумаем о том, какие у тебя варианты. Либо дальше бицца головой об стену, либо все-таки представить на суд общественности репрезентативные тестовые данные с описанием желаемого результата.
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799325
o.makarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AmKad,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
account    |   charge   |  service  | date
505              700             1           01/07/2018
505              200             1           01/09/2018
505              400             1           01/01/2019
505              400             1           01/02/2019
505              -400            2           01/02/2019
555              500             1           01/11/2018
555              500             1           01/03/2019
555              -500            2           01/03/2019
555              400             3           01/03/2019
777              700             1           01/02/2019
777              -700            2           01/02/2019
777              700             1           01/03/2019
888              200             1           01/08/2014
888              -200            1           01/08/2014
888              10               4           01/08/2014
888              200             1           01/12/2018
888              -200            2           01/12/2018



Должно получиться

Код: plsql
1.
2.
3.
4.
5.
account    |  date           |  charge
505            01/01/2019         400
555            01/03/2019         600       
777            01/03/2019         700
888            01/08/2014         10



То есть суммируется сумма по всем услугам и выводится с датой, когда сумма по всем услугам была больше 0 последний раз
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799326
o.makarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
o.makarov,

Прошу прощения, по аккаунту 555 сумма 400, а не 600
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799334
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o.makarovo.makarov,
Прошу прощения, по аккаунту 555 сумма 400, а не 600

555 500 1 01/11/2018
555 500 1 01/03/2019
555 -500 2 01/03/2019
555 400 3 01/03/2019

Код: plsql
1.
2.
3.
4.
5.
sql> select 500+500-500+400 from dual;

500+500-500+400
---------------
            900



зы
суміруете с нарастающим итогом, и выводите мах где больше 0

.....
stax
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799336
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o.makarovТо есть суммируется сумма по всем услугам и выводится с датой, когда сумма по всем услугам была больше 0 последний раз
888 - с суммой согласен, с датой нет
777 - согласен
555 - 900, дату попал
505 - сумма не та, дата не та
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799341
o.makarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Видимо не очень я объясняю.

Нужна сумма больше 0 за месяц,
То есть если есть следующие начисления
Код: plsql
1.
2.
3.
4.
5.
6.
7.
555 100 01/01/2019
555 100 01/02/2019
555 -100 01/02/2019
555 200 01/03/2019
555 100 01/03/2019
555 300 01/04/2019
555 -300 01/04/2019



Должно вывести
555 300 01/03/2019

Поскольку последний месяц, когда сумма была больше 0, это 01/03/2019.
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799363
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
o.makarovStax,

Видимо не очень я объясняю.

Нужна сумма больше 0 за месяц,
То есть если есть следующие начисления
Код: plsql
1.
2.
3.
4.
5.
6.
7.
555 100 01/01/2019
555 100 01/02/2019
555 -100 01/02/2019
555 200 01/03/2019
555 100 01/03/2019
555 300 01/04/2019
555 -300 01/04/2019



Должно вывести
555 300 01/03/2019

Поскольку последний месяц, когда сумма была больше 0, это 01/03/2019.

допилите
Код: 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.
with t(account,charge,service,date1) as (
select 505,              700,             1,to_date('           01/07/2018') from dual union all
select 505,              200,             1,to_date('           01/09/2018') from dual union all
select 505,              400,             1,to_date('           01/01/2019') from dual union all
select 505,              400,             1,to_date('           01/02/2019') from dual union all
select 505,              -400,            2,to_date('           01/02/2019') from dual union all
select 555,              500,             1,to_date('           01/11/2018') from dual union all
select 555,              500,             1,to_date('           01/03/2019') from dual union all
select 555,              -500,            2,to_date('           01/03/2019') from dual union all
select 555,              400,             3,to_date('           01/03/2019') from dual union all
select 777,              700,             1,to_date('           01/02/2019') from dual union all
select 777,              -700,            2,to_date('           01/02/2019') from dual union all
select 777,              700,             1,to_date('           01/03/2019') from dual union all
select 888,              200,             1,to_date('           01/08/2014') from dual union all
select 888,              -200,            1,to_date('           01/08/2014') from dual union all
select 888,              10,              4,to_date('           01/08/2014') from dual union all
select 888,              200,             1,to_date('           01/12/2018') from dual union all
select 888,              -200,            2,to_date('           01/12/2018') from dual 
)
select account,max(trunc(date1,'mm')) max_date1 
,max(ss) KEEP (DENSE_RANK LAST ORDER BY date1) s
from 
 (select account,date1,sum(charge) over (partition by account,trunc(date1,'mm') order by date1) ss from t)
where ss>0
group by account
order by 1
/
SQL> /

   ACCOUNT MAX_DATE          S
---------- -------- ----------
       505 01.01.19        400
       555 01.03.19        400
       777 01.03.19        700
       888 01.08.14         10



зы
тестовые данные желательно в форме "with"

.....
stax
...
Рейтинг: 0 / 0
Вывести положительную сумму на последнюю даты
    #39799823
o.makarov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

Спасибо большое, вроде бы всё работает, как нужно, вы очень помогли)

По поводу тестовых данных учту на будущее
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести положительную сумму на последнюю даты
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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