题解 | 统计每个产品的销售情况 - 子查询加加加加到厌倦

统计每个产品的销售情况

https://www.nowcoder.com/practice/d431aa7bf72c4fd7b048ec639bc83ad2

with
    t as (
        select
            t1.product_id,
            t1.order_id,
            t1.customer_id,
            t1.quantity,
            t1.order_date,
            month (t1.order_date) as order_month,
            t2.unit_price,
            case
                when (t3.customer_age >= 1)
                and (t3.customer_age <= 10) then '1-10'
                when (t3.customer_age >= 11)
                and (t3.customer_age <= 20) then '11-20'
                when (t3.customer_age >= 21)
                and (t3.customer_age <= 30) then '21-30'
                when (t3.customer_age >= 31)
                and (t3.customer_age <= 40) then '31-40'
                when (t3.customer_age >= 41)
                and (t3.customer_age <= 50) then '41-50'
                when (t3.customer_age >= 51)
                and (t3.customer_age <= 60) then '51-60'
                when (t3.customer_age >= 61) then '61+'
            end as customer_age_group
        from
            orders t1
            left join products t2 on t1.product_id = t2.product_id
            left join customers t3 on t1.customer_id = t3.customer_id
    ),
    m as (
        select
            product_id,
            order_month,
            sum(quantity) as month_quantity
        from
            t
        group by
            product_id,
            order_month
    ),
    a2 as (
        select
            product_id,
            sum(quantity) as q,
            customer_age_group
        from
            t
        group by
            product_id,
            customer_age_group
    ),
    a3 as (
        select
            *,
            row_number() over (
                partition by
                    product_id
                order by
                    q desc,
                    customer_age_group
            ) as rn
        from
            a2
    ),
    a as (
        select
            product_id,
            customer_age_group
        from
            a3
        where
            rn = 1
    )
select
    b.*,
    a.customer_age_group
from
    (
        select
            a1.*,
            max(m.month_quantity) as max_monthly_quantity
        from
            (
                select
                    t.product_id,
                    sum(t.quantity * t.unit_price) as total_sales,
                    t.unit_price,
                    sum(t.quantity) as total_quantity,
                    round(sum(t.quantity * t.unit_price) / 12, 2) as avg_monthly_sales
                from
                    t
                group by
                    t.product_id
            ) a1
            left join m on a1.product_id = m.product_id
        group by
            a1.product_id
    ) b
    left join a on b.product_id = a.product_id
order by
    b.total_sales desc,
    product_id

全部评论

相关推荐

墨西哥大灰狼:如果你的校友卤馆还在的话,他肯定会给你建议的,可是卤馆注销了@ 程序员卤馆
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务