Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Вывести положительную сумму на последнюю даты / 12 сообщений из 12, страница 1 из 1
10.04.2019, 12:16
    #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
10.04.2019, 12:30
    #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
10.04.2019, 12:30
    #39799260
AmKad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести положительную сумму на последнюю даты
Ты ведь уже спрашивал .
...
Рейтинг: 0 / 0
10.04.2019, 12:39
    #39799265
o.makarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести положительную сумму на последнюю даты
AmKad,

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

Давай подумаем о том, какие у тебя варианты. Либо дальше бицца головой об стену, либо все-таки представить на суд общественности репрезентативные тестовые данные с описанием желаемого результата.
...
Рейтинг: 0 / 0
10.04.2019, 13:44
    #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
10.04.2019, 13:45
    #39799326
o.makarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести положительную сумму на последнюю даты
o.makarov,

Прошу прощения, по аккаунту 555 сумма 400, а не 600
...
Рейтинг: 0 / 0
10.04.2019, 13:52
    #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
10.04.2019, 13:53
    #39799336
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести положительную сумму на последнюю даты
o.makarovТо есть суммируется сумма по всем услугам и выводится с датой, когда сумма по всем услугам была больше 0 последний раз
888 - с суммой согласен, с датой нет
777 - согласен
555 - 900, дату попал
505 - сумма не та, дата не та
...
Рейтинг: 0 / 0
10.04.2019, 13:59
    #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
10.04.2019, 14:20
    #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
11.04.2019, 12:29
    #39799823
o.makarov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывести положительную сумму на последнюю даты
Stax,

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

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


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