WITH order_by_product_by_month AS( SELECT product_id, avg(month_quantity) AS avg_monthly_quantity, --这一步不需要哈,理解错题意了,但是如果有这一步就更难 max(month_quantity) AS max_monthly_quantity FROM (SELECT product_id, DATE_FORMAT(order_date,'%Y-%m') AS order_month, SUM(quantity) AS month_quantity FROM orders GROUP BY product_id,DATE_FORMAT(order_date,'%Y-%m')) AS t1 GROUP BY product_id ), order_by_product AS( SELECT a.product_id, b.unit_price * SUM(a.quantity) AS total_sales, b.unit_price, SUM(a.quantity) AS total_quantity FROM orders AS a LEFT JOIN products AS b ON a.product_id=b.product_id GROUP BY a.product_id,b.unit_price ), order_by_age AS( SELECT t2.product_id, CASE WHEN t2.customer_age MOD 10=0 THEN CONCAT(CAST((t2.customer_age DIV 10-1) *10+1 AS CHAR),'-',CAST((t2.customer_age DIV 10)*10 AS CHAR)) ELSE CONCAT(CAST(t2.customer_age DIV 10 *10+1 AS CHAR),'-',CAST((t2.customer_age DIV 10+1)*10 AS CHAR)) END AS customer_age_group FROM (SELECT a.product_id, a.customer_id, c.customer_age, rank() over (partition by a.product_id order by a.quantity DESC,c.customer_age) AS rk FROM orders AS a LEFT JOIN customers AS c ON a.customer_id=c.customer_id) AS t2 WHERE t2.rk=1 ) SELECT a.product_id, a.total_sales, a.unit_price, a.total_quantity, round(a.total_sales/12,2) AS avg_monthly_sales, b.max_monthly_quantity, c.customer_age_group FROM order_by_product AS a LEFT JOIN order_by_product_by_month AS b ON a.product_id=b.product_id LEFT JOIN order_by_age AS c ON a.product_id=c.product_id ORDER BY a.total_sales DESC;