запись за последние два месяца и их разница в oracle - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужна разница за последние два месяца, и я использую запрос ниже

with Positions as
(
select  
    COUNT(DISTINCT A_SALE||B_SALE) As SALES, 
    TO_CHAR(DATE,'YYYY-MON') As Period
from ORDERS
where DATE between date '2020-02-01' and date '2020-02-29'
group by TO_CHAR(DATE,'YYYY-MON') 

union all

select  
    COUNT(DISTINCT A_SALE||B_SALE) As SALES, 
    TO_CHAR(DATE,'YYYY-MON') As Period
from ORDERS
where DATE between date '2020-03-01' and date '2020-03-31'
group by TO_CHAR(DATE,'YYYY-MON') 

)
select  
    SALES,
    period,
    case when to_char(round((SALES-lag(SALES,1, SALES) over (order by period desc))/ SALES*100,2), 'FM999999990D9999') <0 
         then to_char(round(abs( SALES-lag(SALES,1, SALES) over (order by period desc))/ SALES*100,2),'FM999999990D9999')||'%'||'  (Increase) '
         when to_char(round((SALES-lag(SALES,1,SALES) over (order by period  desc))/SALES*100,2),'FM999999990D9999')>0 
         then to_char(round(abs(SALES-lag(SALES,1, SALES) over (order by period desc ))/SALES*100,2),'FM999999990D9999')||'%'||'  (Decrease) '
    END as variances
from Positions  
order by Period;

Я получаю вывод, как это

SALES    |     Period       |     variances
---------|------------------|--------------------
100      |  2020-FEB        |     100%(Increase)
200      |  2020-MAR        |       NULL

Я хочу записать что-то подобное, где дисперсия впереди марта вместо февраля, поскольку мы ищем дисперсию за последний месяц

SALES    |     Period       |     variances
---------|------------------|--------------------
200      |  2020-MAR        |     100%(Increase)
100      |  2020-FEB        |       NULL 

1 Ответ

0 голосов
/ 14 апреля 2020

Я не анализировал запрос слишком подробно, но у вас есть один очевидный недостаток. Вы меняете свой период с даты на символ. Это означает, что когда вы применяете свои оконные функции, ваш порядок не будет работать должным образом.

упорядоченная дата des c будет выглядеть (на основе хронологического упорядочения)

MAR - 2020
FEB - 2020
JAN - 2020

Упорядоченный текст des c будет выглядеть (основываясь на алфавитном порядке)

MAR - 2020
JAN - 2020
FEB - 2020

При этом вы сравниваете «хороший» случай (FEB + MAR), в котором и порядок текста, и порядок даты будут работать одинаково way.

Подразумеваемый порядок: ASCENDING. Таким образом, в конце, когда вы выполните

order by Period;

, сначала отобразится февраль, а затем март. Если вы сделаете

order by Period DESC;

, сначала отобразится март.

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