with year as (
     select
        p.product_id,
         sum(p.unit_price * o.quantity) as total_sales,
         sum(o.quantity) as total_quantity
    from
        products p
        left join orders o on p.product_id = o.product_id
    where
        year(o.order_date) = '2023'
    group by
        p.product_id
),
month as (
    select
        product_id,
        sum(monthly_sales)/12 as avg_monthly_sales,
        max(monthly_quantity) as max_monthly_quantity
    from (
        select
            p.product_id,
            month(order_date) as month,
            sum(p.unit_price * o.quantity) as monthly_sales,
            sum(o.quantity) as monthly_quantity
        from
            products p
            left join orders o on p.product_id = o.product_id
        where
            year(o.order_date) = '2023'
        group by
            p.product_id,
            month(order_date)
            ) sub
    group by product_id
),
customer1 as (
    select
        product_id,
        customer_id,
        customer_age,
        row_number() over (
                partition by
                product_id
                order by
                    cnt desc,
                    customer_age asc
             ) as rk
    from
         (select
            p.product_id,
            c.customer_id,
            c.customer_age,
            sum(o.quantity) as cnt
        from
            products p
            left join orders o on p.product_id = o.product_id
            left join customers c on o.customer_id = c.customer_id
        where
            year(o.order_date) = '2023'
        group by
            p.product_id,
            c.customer_id,
            c.customer_age) sub
),
age 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
        customer1
    where
        rk = 1
)
select
    p.product_id,
    round(y.total_sales,2) total_sales,
    round(p.unit_price,2) unit_price,
    round(y.total_quantity,2) total_quantity,
    round(m.avg_monthly_sales,2) avg_monthly_sales,
    round(m.max_monthly_quantity,2) max_monthly_quantity,
    a.customer_age_group
from
    products p
    left join year y on p.product_id = y.product_id
    left join month m on p.product_id=m.product_id
    left join age a on p.product_id=a.product_id
order by
    total_sales desc,
    p.product_id asc

一个一个表拆开来写就还好,混在一起就很复杂

算月平均销售额用全年销售额/12,不要统计单独的每个月然后直接取平均,因为某几个月可能没有产品卖出