E-Commerce_ELT / sql /revenue_by_month_year.sql
iBrokeTheCode's picture
chore: Add SQL scripts for revenue and delivery analysis
a312419
-- Calculates revenue by month and year
--
-- It will have different columns:
-- 1. month_no, with the month numbers going from 01 to 12
-- 2. month, with the 3 first letters of each month (e.g. Jan, Feb)
-- 3. Year2016, with the revenue per month of 2016 (0.00 if it doesn't exist)
-- 4. Year2017, with the revenue per month of 2017 (0.00 if it doesn't exist)
-- 5. Year2018, with the revenue per month of 2018 (0.00 if it doesn't exist)
--
-- Explanation step by step:
-- 1. Calculate the revenue for each order
-- 2. Group the data by month
-- 3. Calculate the average revenue for each month
WITH
month_names AS (
SELECT
'01' AS month_no,
'Jan' AS month
UNION ALL
SELECT
'02',
'Feb'
UNION ALL
SELECT
'03',
'Mar'
UNION ALL
SELECT
'04',
'Apr'
UNION ALL
SELECT
'05',
'May'
UNION ALL
SELECT
'06',
'Jun'
UNION ALL
SELECT
'07',
'Jul'
UNION ALL
SELECT
'08',
'Aug'
UNION ALL
SELECT
'09',
'Sep'
UNION ALL
SELECT
'10',
'Oct'
UNION ALL
SELECT
'11',
'Nov'
UNION ALL
SELECT
'12',
'Dec'
),
-- Get the minimum payment per order
min_payments AS (
SELECT
oop.order_id,
MIN(oop.payment_value) AS min_payment
FROM
olist_order_payments oop
GROUP BY
oop.order_id
),
-- Calculate revenue grouped by year and month
revenue AS (
SELECT
strftime ('%m', oo.order_delivered_customer_date) AS month_no,
strftime ('%Y', oo.order_delivered_customer_date) AS year,
SUM(mp.min_payment) AS total_revenue
FROM
olist_orders oo
JOIN min_payments mp ON oo.order_id = mp.order_id
WHERE
oo.order_status = 'delivered'
AND oo.order_delivered_customer_date IS NOT NULL
AND strftime ('%Y', oo.order_delivered_customer_date) IN ('2016', '2017', '2018')
GROUP BY
month_no,
year
)
-- Final Select
SELECT
mn.month_no,
mn.month,
COALESCE(
MAX(
CASE
WHEN r.year = '2016' THEN r.total_revenue
END
),
0.0
) AS Year2016,
COALESCE(
MAX(
CASE
WHEN r.year = '2017' THEN r.total_revenue
END
),
0.0
) AS Year2017,
COALESCE(
MAX(
CASE
WHEN r.year = '2018' THEN r.total_revenue
END
),
0.0
) AS Year2018
FROM
month_names mn
LEFT JOIN revenue r ON mn.month_no = r.month_no
GROUP BY
mn.month_no,
mn.month
ORDER BY
mn.month_no;