powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Запрос. Ненулевые суммы ближайшие к дате
14 сообщений из 14, страница 1 из 1
Запрос. Ненулевые суммы ближайшие к дате
    #39825683
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.
Натоклните на мысль.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
with t as (
SELECT to_date('01.01.2019','dd.mm.yyyy') as dat , 6 as amount from dual union all
SELECT to_date('02.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('03.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('04.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('05.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('06.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('08.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('09.01.2019','dd.mm.yyyy') as dat , 3 as amount from dual  
)

SELECT t.*,
  lag(Amount, 1, NULL) over(PARTITION BY 1 ORDER BY dat) AS prev_val
                  FROM t
           



Нужно просуммировать amount-ы которые не равны нулю (до первого нулевого) относительно входящей даты (меньше либо равно входящей даты).

Пример : входящая дата 09.01.2019 - сумма = 10 (это сумма с дат 06.01.2019+08.01.2019+09.01.2019)
входящая дата 02.01.2019 - сумма = 8 (это сумма с дат 01.01.2019+02.01.2019)
Спасибо
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825715
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Moss,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2  SELECT to_date('01.01.2019','dd.mm.yyyy') as dat , 6 as amount from dual union all
  3  SELECT to_date('02.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
  4  SELECT to_date('03.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
  5  SELECT to_date('04.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
  6  SELECT to_date('05.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
  7  SELECT to_date('06.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
  8  SELECT to_date('08.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
  9  SELECT to_date('09.01.2019','dd.mm.yyyy') as dat , 3 as amount from dual
 10  )
 11  select sum(amount) ss from t
 12  where dat<=date '2019-01-09' and dat>
 13* (select max(dat) from t t2 where t2.dat<=date '2019-01-09' and t2.amount=0)
SQL> /

        SS
----------
        10



.....
stax
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825717
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with t as (
SELECT to_date('01.01.2019','dd.mm.yyyy') as dat , 6 as amount from dual union all
SELECT to_date('02.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('03.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('04.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('05.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('06.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('08.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('09.01.2019','dd.mm.yyyy') as dat , 3 as amount from dual  
)

SELECT sum(amount) FROM t 
WHERE dat BETWEEN (
SELECT MAX(dat) FROM (
SELECT t.*,
  lag(Amount) over(PARTITION BY 1 ORDER BY dat) AS prev_val
                  FROM t 
                  ) tt
            WHERE tt.amount<>0 
                 AND ( prev_val=0 OR prev_val is null)
                 AND dat<=to_date('09.01.2019','dd.mm.yyyy') -- входящая дата
                  )
                 AND to_date('09.01.2019','dd.mm.yyyy') -- входящая дата



сделал так но странно выглядит
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825720
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax,
ой nvl забыл
Код: plsql
1.
2.
3.
4.
select sum(amount) ss from t 
where dat<=date '2019-01-02' and dat> 
nvl((select max(dat) from t t2 where t2.dat<=date '2019-01-02' and t2.amount=0),date '1-1-1')
/



.....
stax
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825725
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо!
Возможно я описал неправильно.
У вас верно до первой нулевой суммы.
Нужно все-таки либо до нулевой либо просто до первого движения.

StaxMoss,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> ed
Wrote file afiedt.buf

  1  with t as (
  2  SELECT to_date('01.01.2019','dd.mm.yyyy') as dat , 6 as amount from dual union all
  3  SELECT to_date('02.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
  4  SELECT to_date('03.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
  5  SELECT to_date('04.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
  6  SELECT to_date('05.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
  7  SELECT to_date('06.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
  8  SELECT to_date('08.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
  9  SELECT to_date('09.01.2019','dd.mm.yyyy') as dat , 3 as amount from dual
 10  )
 11  select sum(amount) ss from t
 12  where dat<=date '2019-01-09' and dat>
 13* (select max(dat) from t t2 where t2.dat<=date '2019-01-09' and t2.amount=0)
SQL> /

        SS
----------
        10



.....
stax
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825728
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
with t as (
    SELECT to_date('01.01.2019','dd.mm.yyyy') as dat , 6 as amount from dual union all
    SELECT to_date('02.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
    SELECT to_date('03.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
    SELECT to_date('04.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
    SELECT to_date('05.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
    SELECT to_date('06.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
    SELECT to_date('08.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
    SELECT to_date('09.01.2019','dd.mm.yyyy') as dat , 3 as amount from dual
   )
   select sum(amount) ss from t
   where dat<=date '2019-01-02' 
       and dat>
     nvl((select max(dat) from t t2 where t2.dat<=date '2019-01-02' and t2.amount=0), (SELECT MIN(dat)-1 FROM t))



Типа того..
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825733
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
увидел спасибо
StaxStax,
ой nvl забыл
Код: plsql
1.
2.
3.
4.
select sum(amount) ss from t 
where dat<=date '2019-01-02' and dat> 
nvl((select max(dat) from t t2 where t2.dat<=date '2019-01-02' and t2.amount=0),date '1-1-1')
/



.....
stax
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825745
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
WITH T AS (
SELECT to_date('01.01.2019','dd.mm.yyyy') as dat , 6 as amount from dual union all
SELECT to_date('02.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('03.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('04.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('05.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('06.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('08.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('09.01.2019','dd.mm.yyyy') as dat , 3 as amount from dual  
),
X AS (
      SELECT * FROM T WHERE DAT <= DATE '2019-01-09'
     )
SELECT  TOTAL_AMOUNT
  FROM  X
  MATCH_RECOGNIZE(
                  ORDER BY DAT DESC
                  MEASURES SUM(AMOUNT) TOTAL_AMOUNT
                  PATTERN(DOWN+)
                  DEFINE DOWN AS AMOUNT != 0 AND MATCH_NUMBER() = 1
                 )
/

TOTAL_AMOUNT
------------
          10

SQL> 



SY.
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825746
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надеюсь DAT уникальны. Если нет, то каковы правила когда та-же DAT и с нулевыми и с ненулевыми AMOUNT?

SY.
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825757
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYНадеюсь DAT уникальны.

а какая разница?
добавить в сортировку "AMOUNT"

....
stax
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825775
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax
добавить в сортировку "AMOUNT"


Вопрос к правилам. Если есть 0 для даты нужно ли суммировать остальные AMOUNT этой даты?

SY.
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825784
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStax
добавить в сортировку "AMOUNT"


Вопрос к правилам. Если есть 0 для даты нужно ли суммировать остальные AMOUNT этой даты?

SY.
сортировать в зависимости "нужно ли суммировать "

.....
stax
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825787
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, но Оракл 11 ((
SY
Код: 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.
WITH T AS (
SELECT to_date('01.01.2019','dd.mm.yyyy') as dat , 6 as amount from dual union all
SELECT to_date('02.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('03.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('04.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('05.01.2019','dd.mm.yyyy') as dat , 0 as amount  from dual union all
SELECT to_date('06.01.2019','dd.mm.yyyy') as dat , 2 as amount from dual  union all
SELECT to_date('08.01.2019','dd.mm.yyyy') as dat , 5 as amount  from dual union all
SELECT to_date('09.01.2019','dd.mm.yyyy') as dat , 3 as amount from dual  
),
X AS (
      SELECT * FROM T WHERE DAT <= DATE '2019-01-09'
     )
SELECT  TOTAL_AMOUNT
  FROM  X
  MATCH_RECOGNIZE(
                  ORDER BY DAT DESC
                  MEASURES SUM(AMOUNT) TOTAL_AMOUNT
                  PATTERN(DOWN+)
                  DEFINE DOWN AS AMOUNT != 0 AND MATCH_NUMBER() = 1
                 )
/

TOTAL_AMOUNT
------------
          10

SQL> 



SY.
...
Рейтинг: 0 / 0
Запрос. Ненулевые суммы ближайшие к дате
    #39825789
Moss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYНадеюсь DAT уникальны. Если нет, то каковы правила когда та-же DAT и с нулевыми и с ненулевыми AMOUNT?

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


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