logi c для вычитания и получения дисперсии в oracle - PullRequest
0 голосов
/ 13 марта 2020

как написать логи c для получения следующих выводов

with b2 as
(
select COUNT(SaLE) As cnt, 
TO_CHAR(date,'YYYY-MON') As Period

  from Order
  where date between date '2020-02-01' and date '2020-02-28'
group by TO_CHAR(BATCH_DTE_CYMD,'YYYY-MON') 

union all
select  COUNT(Sale) As cnt,
TO_CHAR(Date,'YYYY-MON') As Period

  from Order
  where date between date '2020-01-01' and date '2020-01-31'
group by TO_CHAR(Date,'YYYY-MON') 

)
select  cnt, Period,
       100*(cnt-lag(cnt,1,cnt) over (order by period))
       /lag(cnt,1,cnt) over (order by period)
       as "variance(%)"
  from b2
 order by period 

я получаю этот вывод

Cnt   | period     |    variance(%)
11917 | 2020-FEB   |    0
11707 | 2020-JAN   |    -1.76218847025258034740286984979441134514

но я хочу этот вывод

Cnt   | period     |    variance(%)                                               | sign                                                                                
11917 | 2020-FEB   |    JAN-FEB (Variance we get in feb in % (with no decimal))   | Increase/decrease 
11707 | 2020-JAN   |    0                                                         |  0

Ответы [ 2 ]

0 голосов
/ 13 марта 2020

Проблема с вашим кодом заключается в том, что вы используете LAG в столбце CHAR (PERIOD), что неверно, поскольку 2020-FEB ниже, чем 2020-JAN , когда сравнение в строке.

Вы должны использовать их как функцию date in LAG следующим образом:

WITH B2 AS (
    SELECT COUNT(SALE) AS CNT,
           TRUNC(DATE, 'MON') AS PERIOD
      FROM ORDER
     WHERE DATE BETWEEN DATE '2020-01-01' AND DATE '2020-02-28'
    GROUP BY TRUNC(DATE, 'MON')
)
SELECT
    CNT,
    TO_CHAR(PERIOD,'YYYY-MON') AS PERIOD,
    100 * ( CNT - LAG(CNT, 1, CNT) OVER( ORDER BY PERIOD ) ) 
    / LAG(CNT, 1, CNT) OVER(ORDER BY PERIOD) 
    AS "variance(%)"
FROM B2
ORDER BY PERIOD

Приветствия !!

0 голосов
/ 13 марта 2020

Попробуйте запрос ниже:

select cnt,period,
case when variance<>0 then 
'JAN-FEB(Variance we get in feb in '||to_char(round(variance,0))||')' 
else to_char(variance) end as variance,
case when SIGN (variance)<0 then 'Decrease' 
when sign(variance)=0 then 'No Change' else 'Increase' 
end as sign  from(select  cnt, Period,
       100*(cnt-lag(cnt,1,cnt) over (order by period desc ))
       /lag(cnt,1,cnt) over (order by period desc)
       as variance
  from test
)t
order by period

Я использовал round функцию, которая преобразует -1.7.. в -2. Вы также можете использовать Ceil

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