Не конвертируйте даты в строки для их округления. Особенно, если вы собираетесь заказать по этой строке. Вы не хотите, чтобы '2020-Feb'
предшествовал '2020-Jan'
...
Во-вторых, у вас есть ABS()
в части 'WHEN' вашего CASE
выражения, но вам нужно в части THEN
...
CASE WHEN ABS(x) < 0 -- This is what you have, which is NEVER true
В-третьих, вашему CTE не нужно объединять два набора данных вместе, вам просто нужно одно предложение WHERE ...
Наконец, не повторяйте ваш код несколько раз, используйте CTE или другие шаблоны, чтобы написать его всего один раз ...
WITH
b1 AS
(
-- Using ROUND and avoiding UNION ALL
SELECT COUNT(DISTINCT Sales) AS cnt,
ROUND(Date, 'MONTH') AS Period
FROM orders
WHERE Date >= DATE '2020-02-01'
AND Date < DATE '2020-04-01'
GROUP BY ROUND(Date, 'MONTH')
),
b2 AS
(
SELECT cnt,
Period,
cnt - LAG (cnt, 1, cnt) OVER (ORDER BY period DESC) AS delta
FROM b1
)
SELECT cnt,
Period,
ROUND(
ABS(delta) * 100 / cnt,
2
)
AS variances,
CASE WHEN delta < 0 THEN 'increase'
ELSE 'decrease' END AS variance_direction
FROM b2
ORDER BY Period;