Spaces:
Sleeping
Sleeping
| -- 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; |