MTD за предыдущий месяц - PullRequest
0 голосов
/ 06 августа 2020

Можно ли найти MTD за предыдущий месяц? Итак, мои данные находятся на уровне дня, и мне нужно найти MTD и MTD за предыдущий месяц

D_date               product    TOTAL_UNIT
01/AUG/2020            A         10
01/AUG/2020            B         20
02/AUG/2020            A         15
02/AUG/2020            B         25
29/JUL/2020            A          5
29/JUL/2020            B          0
30/JUL/2020            A          2
31/JUL/2020            B         30

Я могу получить MTD за текущий месяц, используя ниже SQL (Oracle)

SUM(TOTAL_UNIT)OVER( PARTITION BY PRODUCT, TRUNC(D_DATE,'MM') ORDER BY D_DATE )MTD

Однако, когда я делаю add_months -1 для получения PMTD, он все еще показывает текущий MTD

Я пытался сделать

SUM(TOTAL_UNIT)OVER( PARTITION BY PRODUCT, TRUNC(ADD_MONTHS(D_DATE,-1),'MM') ORDER BY D_DATE )MTD

Другой способ, который я могу найти, - это выполнить самосоединение, но Я бы хотел избежать этого из-за проблем с производительностью.

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Изменение вашего раздела по разделам на TRUNC(ADD_MONTHS(D_DATE,-1),'MM') - или ADD_MONTHS(TRUNC(D_DATE,'MM'),-1) - дает вам другое значение для этого разделения, но точно такие же группы, как обычные TRUNC(D_DATE,'MM').

Если вы хотите получить последний MTD до текущего месяца, вы можете поместить существующий запрос как подзапрос и использовать lag():

select d_date, product, total_unit, m_date, mtd,
  last_value(mtd) over (partition by product order by m_date range between unbounded preceding and 1 preceding) as prev_mtd
from (
  select d_date, product, total_unit,
    TRUNC(D_DATE,'MM') m_date,
    SUM(TOTAL_UNIT)OVER( PARTITION BY PRODUCT, TRUNC(D_DATE,'MM') ORDER BY D_DATE )MTD
  from your_table
)
order by product, d_date;
D_DATE    | PRODUCT | TOTAL_UNIT | M_DATE    | MTD | PREV_MTD
:-------- | :------ | ---------: | :-------- | --: | -------:
29-JUL-20 | A       |          5 | 01-JUL-20 |   5 |     null
30-JUL-20 | A       |          2 | 01-JUL-20 |   7 |     null
01-AUG-20 | A       |         10 | 01-AUG-20 |  10 |        7
02-AUG-20 | A       |         15 | 01-AUG-20 |  25 |        7
29-JUL-20 | B       |          0 | 01-JUL-20 |   0 |     null
31-JUL-20 | B       |         30 | 01-JUL-20 |  30 |     null
01-AUG-20 | B       |         20 | 01-AUG-20 |  20 |       30
02-AUG-20 | B       |         25 | 01-AUG-20 |  45 |       30

db <> fiddle

0 голосов
/ 06 августа 2020

Это потому, что вы используете add_months внутри функции c analyti. Итак, вы вычисляете сумму, разделенную по месяцам, как если бы это был предыдущий месяц. Хотя последняя часть не имеет для меня особого смысла, она дает вам правильную СУММ, но вы этого не сделали. скажите SQL, чтобы показать и предыдущий месяц.

Если вы хотите, чтобы D_DATE отображалась как в предыдущем месяце, добавьте еще один столбец trunc( ADD_MONTHS( d_date, -1), 'MM') as pmtd

select trunc( ADD_MONTHS( sysdate, -1), 'MM') from dual;

Это всегда будет вам первое число предыдущего месяца.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...