how to write a logic for getting the below output
x
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
i am getting this ouput
Cnt | period | variance(%)
11917 | 2020-FEB | 0
11707 | 2020-JAN | -1.76218847025258034740286984979441134514
but i want the this output
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
Advertisement
Answer
The issue with your code is, You are using LAG
on the CHAR
column(PERIOD
) which is not correct as 2020-FEB is lower than the 2020-JAN when the comparison is in the string.
You must use them as the date
in LAG
function as following:
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
Cheers!!