题目需求:
从订单信息表(order_info)中统计每个用户截止其每个下单日期的累积消费金额,以及每个用户在其每个下单日期的VIP等级。
用户vip等级根据累积消费金额计算,计算规则如下:
设累积消费总额为X,
若0=<X<10000,则vip等级为普通会员
若10000<=X<30000,则vip等级为青铜会员
若30000<=X<50000,则vip等级为白银会员
若50000<=X<80000,则vip为黄金会员
若80000<=X<100000,则vip等级为白金会员
若X>=100000,则vip等级为钻石会员
期望结果如下:
user_id (用户id) | create_date (下单日期) | sum_so_far <decimal(16,2)> (截至每个下单日期的累计下单金额) | vip_level (每个下单日期的VIP等级) |
---|---|---|---|
101 | 2021-09-27 | 29000.00 | 青铜会员 |
101 | 2021-09-28 | 99500.00 | 白金会员 |
101 | 2021-09-29 | 142800.00 | 钻石会员 |
101 | 2021-09-30 | 143660.00 | 钻石会员 |
… | … | … | … |
需要用到的表:
订单信息表:order_info
order_id (订单id) | user_id (用户id) | create_date (下单日期) | total_amount (订单金额) |
---|---|---|---|
1 | 101 | 2021-09-30 | 29000.00 |
10 | 103 | 2020-10-02 | 28000.00 |
实现一
-- 3) 统计每个用户在其每个下单日期的VIP等级。注意:是按照sum_so_far计算,不是sum_total_amount
select user_id,
create_date,
sum_so_far,
case
when 0 <= sum_so_far and sum_so_far < 10000 then '普通会员'
when 10000 <= sum_so_far and sum_so_far < 30000 then '青铜会员'
when 30000 <= sum_so_far and sum_so_far < 50000 then '白银会员'
when 50000 <= sum_so_far and sum_so_far < 80000 then '黄金会员'
when 80000 <= sum_so_far and sum_so_far < 100000 then '白金会员'
when 100000 <= sum_so_far then '钻石会员'
end as vip_level
from (
-- 2) 统计每个用户截止其每个下单日期的累积消费金额。使用 over()
select user_id,
create_date,
sum(sum_total_amount) over (partition by user_id order by create_date) as sum_so_far
from (
-- 1) 统计每个用户在每个下单日期的总消费金额
select user_id,
create_date,
sum(total_amount) sum_total_amount
from order_info
group by user_id, create_date
) t1
) t2;
题目来源
http://practice.atguigu.cn/#/question/4/desc?qType=SQL