CREATE OR REPLACE FUNCTION get_products_monthly_sales() RETURNS TABLE ( product_code INT, product_description TEXT, year INT, month INT, number_of_orders BIGINT, total_quantity_sold BIGINT, total_revenue NUMERIC ) LANGUAGE plpgsql AS $$ BEGIN RETURN QUERY SELECT p.code AS product_code, p.description AS product_description, EXTRACT(YEAR FROM o.last_modified_date)::INT AS year, EXTRACT(MONTH FROM o.last_modified_date)::INT AS month, COUNT(DISTINCT o.order_num) AS number_of_orders, SUM(o.quantity) AS total_quantity_sold, SUM( p.price * o.quantity * (1 - COALESCE(o.discount, 0) / 100.0) ) AS total_revenue FROM product p JOIN includes i ON p.code = i.code JOIN "order" o ON i.order_num = o.order_num GROUP BY p.code, p.description, EXTRACT(YEAR FROM o.last_modified_date), EXTRACT(MONTH FROM o.last_modified_date) ORDER BY year DESC, month DESC, total_revenue DESC; END; $$;