WITH t1 AS(    
    SELECT product_id,
    round(sum(quantity*unit_price),2) AS total_sales,
    unit_price,
    sum(quantity) AS total_quantity,
    round(sum(unit_price*quantity)/12,2) AS avg_monthly_sales,
    max(quantity) AS max_monthly_quantity
    FROM(   
        SELECT a.customer_id,a.product_id,a.quantity,month(a.order_date) as month,b.unit_price,c.customer_age
        FROM orders AS a
        JOIN products AS b ON a.product_id = b.product_id 
        JOIN customers AS c ON a.customer_id = c.customer_id
    ) AS d 
    GROUP BY product_id
),
t2 AS(   
    SELECT product_id,customer_age 
    FROM(  
        SELECT *,
        ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY total_quantity DESC,customer_age ASC) AS rk
        FROM(    
            SELECT m.customer_id,m.product_id,sum(m.quantity) total_quantity,n.customer_age
            FROM orders AS m
            JOIN customers as n ON m.customer_id = n.customer_id 
            GROUP BY customer_id,product_id
        ) AS o
    ) AS p 
    WHERE rk = 1
)

SELECT t1.*,
(
    CASE 
        WHEN t2.customer_age >= 1 AND t2.customer_age <= 10 THEN '1-10'
        WHEN t2.customer_age >= 11 AND t2.customer_age <= 20 THEN '11-20'
        WHEN t2.customer_age >= 21 AND t2.customer_age <= 30 THEN '21-30'
        WHEN t2.customer_age >= 31 AND t2.customer_age <= 40 THEN '31-40'
        WHEN t2.customer_age >= 41 AND t2.customer_age <= 50 THEN '41-50'
        WHEN t2.customer_age >= 51 AND t2.customer_age <= 60 THEN '51-60'
        WHEN t2.customer_age >= 61  THEN '61+'
        END
) AS customer_age_group
FROM t1 
JOIN t2 ON t1.product_id = t2.product_id
ORDER BY total_sales DESC,product_id ASC




噫,骇死我哩,竟然写了这么长,其实最终结果表的前面部分用临时表t1就解决了。但是最后一列customer_age_group突然发病跟前面的表基本没关系(估计是出题人有意而为之),所以把前面部分和最后一列当作两部分去处理就好了,我的临时表t2就是专门处理最后一列的,t1表的结果就是结果表除了最后一列的部分,t2表的结果是product_id加上customer_age(用GROUP BY + ROW_NUMBER得到购买总数量最多的),然后t1,t2表一连接,用CASE WHEN语句将年龄转化为分组就好了(终于写完了...)