with t1 as ( # 求出产品ID、总销售额、单价、总销量、月平均销售额 select o.product_id as product_id, sum(quantity*unit_price) as total_sales, unit_price, sum(quantity) as total_quantity, round(sum(quantity*unit_price)/12, 2) as avg_monthly_sales from orders o join products p on o.product_id = p.product_id where order_date between '2023-01-01' and '2023-12-31' group by product_id ), quantity_monthly_max_diffpro as ( # 统计单月最高销量 # 对不同产品:先按月统计每个月的销量,再得到一年中单月最高销量(测试用例中每个月只有一个订单,存在局限) select product_id, max(quantity_monthly_onepro) as max_monthly_quantity from ( select product_id, month(order_date), sum(quantity) as quantity_monthly_onepro from orders where order_date between '2023-01-01' and '2023-12-31' group by product_id, month(order_date) ) as quantity_monthly group by product_id ), t2 as ( # 求每种产品购买量最大的客户 select product_id, customer_id from ( select product_id, quantity_amount.customer_id, row_number() over(partition by product_id order by total_quantity_onecus desc, customer_age asc) as rk from ( select product_id, customer_id, sum(quantity) as total_quantity_onecus from orders group by product_id, customer_id ) as quantity_amount left join customers on quantity_amount.customer_id = customers.customer_id group by product_id, quantity_amount.customer_id )as quantity_rank where rk = 1 ), t3 as ( # t2表已求出每种产品购买量最大的客户,此时只需求出他的age即可 select product_id, t2.customer_id, customer_age from t2 left join customers on t2.customer_id = customers.customer_id ), t4 as ( # 将年龄转换为年龄段 select product_id, ( case when customer_age between 1 and 10 then '1-10' when customer_age between 11 and 20 then '11-20' when customer_age between 21 and 30 then '21-30' when customer_age between 31 and 40 then '31-40' when customer_age between 41 and 50 then '41-50' when customer_age between 51 and 60 then '51-60' else '61+' end ) as customer_age_group from t3 ) #最后拼接表 select t1.product_id, total_sales, unit_price, total_quantity, avg_monthly_sales, max_monthly_quantity, customer_age_group from t1 join quantity_monthly_max_diffpro on t1.product_id = quantity_monthly_max_diffpro.product_id join t4 on t1.product_id = t4.product_id order by total_sales desc, t1.product_id asc