План и факт выручки по каналам за 12 месяцев
SQL, по которому посчитано
WITH bounds AS (
SELECT CAST(date_trunc('month', max(date)) AS DATE) AS last_month
FROM sales
),
plan_agg AS (
SELECT p.channel,
SUM(p.revenue) AS plan_revenue
FROM plan p
CROSS JOIN bounds b
WHERE p.month >= b.last_month - INTERVAL '11 months'
AND p.month <= b.last_month
GROUP BY p.channel
),
sales_agg AS (
SELECT s.channel,
SUM(s.revenue - COALESCE(s.returned_revenue, 0)) AS actual_revenue
FROM sales s
CROSS JOIN bounds b
WHERE s.date >= b.last_month - INTERVAL '11 months'
AND s.date < b.last_month + INTERVAL '1 month'
GROUP BY s.channel
)
SELECT COALESCE(p.channel, s.channel) AS channel,
ROUND(COALESCE(p.plan_revenue, 0), 2) AS plan_revenue,
ROUND(COALESCE(s.actual_revenue, 0), 2) AS actual_revenue,
ROUND(COALESCE(s.actual_revenue, 0) - COALESCE(p.plan_revenue, 0), 2) AS revenue_diff,
ROUND(
CASE WHEN COALESCE(p.plan_revenue, 0) = 0 THEN NULL
ELSE COALESCE(s.actual_revenue, 0) / p.plan_revenue
END, 4
) AS completion_ratio,
CASE WHEN p.channel IS NULL THEN 'Нет в плане'
WHEN s.channel IS NULL THEN 'Нет в продажах'
ELSE 'Есть в обоих'
END AS channel_status
FROM plan_agg p
FULL OUTER JOIN sales_agg s ON p.channel = s.channel
ORDER BY ABS(COALESCE(s.actual_revenue, 0) - COALESCE(p.plan_revenue, 0)) DESC
LIMIT 30