首页 > 试题广场 >

更新用户积分信息?

[编程题]更新用户积分信息?
  • 热度指数:29474 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
现有某公司部分订单数据及用户会员等级数据,如下所示:
订单信息表:order_tb(订单id-order_id,用户id-user_id,订单金额-order_price,订单创建时间-order_time)
order_id user_id order_price order_time
101 11 380 2022-09-01 09:00:00
102 12 200 2022-09-01 10:00:00
103 13 260 2022-09-01 12:00:00
104 11 100 2022-09-02 11:00:00
105 12 150 2022-09-02 12:00:00
106 12 1200 2022-09-02 13:00:00
107 11 60 2022-09-03 09:00:00
108 13 380 2022-09-03 09:30:00
会员等级信息表:uservip_tb用户id-user_id,会员等级-vip,积分-point
user_id vip point
10 银卡会员 530
11 银卡会员 1555
12 钻石会员 12000
13 金卡会员 6115
14 普通会员 230
15 银卡会员 810
16 普通会员 330
会员用户如果下订单金额大于100则可获得同订单金额相同数额的积分,请根据这几日订单数据更新用户会员等级表中积分信息。
要求输出:user_id,积分
注:默认现有用户会员等级信息表中积分为未更新状态,并且未获得积分的用户不用输出,最终结果按照积分降序排序。
示例数据结果如下:
user_id point
12 13550
13 6755
11 1935
结果解释:
user_id为10、14、15、16未在这几日下单订,故未获得积分;
其中user_id为11的用户9月1日、2日、3日下订单,订单金额分别为380、100、60,
根据规则仅有9月1日订单可获得380积分,故更新后的积分为1555+380=1935积分;
其他结果同理。
示例1

输入

drop table if exists  `order_tb` ; 
CREATE TABLE `order_tb` (
`order_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`order_price` int(11) NOT NULL,
`order_time` datetime NOT NULL,
PRIMARY KEY (`order_id`));
INSERT INTO order_tb VALUES(101,11,380,'2022-09-01 09:00:00'); 
INSERT INTO order_tb VALUES(102,12,200,'2022-09-01 10:00:00'); 
INSERT INTO order_tb VALUES(103,13,260,'2022-09-01 12:00:00'); 
INSERT INTO order_tb VALUES(104,11,100,'2022-09-02 11:00:00'); 
INSERT INTO order_tb VALUES(105,12,150,'2022-09-02 12:00:00'); 
INSERT INTO order_tb VALUES(106,12,1200,'2022-09-02 13:00:00'); 
INSERT INTO order_tb VALUES(107,11,60,'2022-09-03 09:00:00'); 
INSERT INTO order_tb VALUES(108,13,380,'2022-09-03 09:30:00'); 

drop table if exists  `uservip_tb` ; 
CREATE TABLE `uservip_tb` (
`user_id` int(11) NOT NULL,
`vip` varchar(16) NOT NULL,
`point` int(11) NOT NULL,
PRIMARY KEY (`user_id`));
INSERT INTO uservip_tb VALUES(10,'银卡会员',530); 
INSERT INTO uservip_tb VALUES(11,'银卡会员',1555); 
INSERT INTO uservip_tb VALUES(12,'钻石会员',12000); 
INSERT INTO uservip_tb VALUES(13,'金卡会员',6115); 
INSERT INTO uservip_tb VALUES(14,'普通会员',230); 
INSERT INTO uservip_tb VALUES(15,'银卡会员',810); 
INSERT INTO uservip_tb VALUES(16,'普通会员',330);

输出

user_id|point
12|13550
13|6755
11|1935
SELECT 
    o.user_id,
    SUM(o.order_price) + u.point AS point
FROM order_tb o
JOIN uservip_tb u
ON o.user_id = u.user_id
WHERE o.order_price > 100
GROUP BY o.user_id, u.point
order by point desc;

发表于 2024-12-27 21:12:31 回复(0)
with t1 as(
    select user_id, sum(order_price) point1 from order_tb where order_price>100 group by user_id
), t2 as(
    select t1.user_id, t1.point1+u.point as point
    from t1 left join uservip_tb u on t1.user_id=u.user_id
)
select * from t2 order by point desc
#棒的很

发表于 2025-02-05 00:08:39 回复(0)
select ut.user_id,ut.point+sum_price as point
from uservip_tb as ut inner join
(
    select
    user_id,
    sum(case when order_price > 100 then order_price else 0 end) as sum_price
from order_tb
group by user_id
) t1
on ut.user_id = t1.user_id
order by point desc;

请问大佬为什么模拟执行可以过,提交不行啊
发表于 2025-04-12 13:58:17 回复(2)
select a.user_id, (point + add_point) as point
from (
    select user_id, sum(order_price) as add_point
    from order_tb
    where order_price > 100
    group by user_id
) as a
inner join uservip_tb as u
on a.user_id = u.user_id
order by point desc

发表于 2025-10-20 21:17:26 回复(0)
case when 解法

SELECT 
    uv.user_id,
    uv.point + SUM(CASE WHEN o.order_price > 100 THEN o.order_price ELSE 0 END) AS point
FROM 
    uservip_tb uv
JOIN 
    order_tb o ON uv.user_id = o.user_id
GROUP BY 
    uv.user_id
HAVING 
    SUM(CASE WHEN o.order_price > 100 THEN o.order_price ELSE 0 END) > 0
ORDER BY 
    point DESC;


发表于 2025-04-26 17:48:35 回复(1)
select
a.user_id,
point + sum(if(a.order_price > 100, a.order_price,0)) as point
from order_tb a
join uservip_tb b on a.user_id = b.user_id
group by a.user_id
order by b.point desc ;


发表于 2025-03-24 10:49:56 回复(1)
select user_id,u.point + sum(order_price) point
from order_tb o join uservip_tb u using(user_id)
where order_price > 100
group by user_id
order by point desc

发表于 今天 15:36:31 回复(0)

一、题目背景

我们有两张表:

  1. 订单表 order_tb
    记录了这几天(9月1日到3日)的部分订单,包含:订单ID、用户ID、订单金额、订单时间。

  2. 会员等级信息表 uservip_tb
    记录了每个用户的会员等级和当前积分(注意:这里的积分是未更新的状态,也就是这几天的订单还没有被计入积分)。


二、积分规则

规则只有一句话:

会员用户如果下订单金额大于100则可获得同订单金额相同数额的积分。

意思就是:

  • 只有订单金额 > 100 的订单才能获得积分,获得的积分就等于该订单的金额。

  • 如果订单金额 ≤ 100,则该订单不获得积分。

  • 一个用户可能有多笔符合条件的订单,需要把所有这些订单的金额加起来,作为该用户新增的积分


三、任务要求

我们要更新会员等级表中的积分信息,也就是把这几天的订单产生的积分加到原有的积分上。
输出结果需要包含:

  • 用户ID(user_id)

  • 更新后的积分(原有积分 + 新增积分)

注意

  • 只有在这几天实际获得积分的用户才需要输出(即至少有一笔订单金额 > 100 的用户)。

  • 没有订单的用户,或者订单金额都 ≤ 100 的用户,不输出。

  • 结果按积分从高到低排序。


四、示例数据解析

1. 原有积分(uservip_tb)

user_id vip point
10 银卡会员 530
11 银卡会员 1555
12 钻石会员 12000
13 金卡会员 6115
14 普通会员 230
15 银卡会员 810
16 普通会员 330

2. 这几天的订单(order_tb)

order_id user_id order_price order_time
101 11 380 2022-09-01 09:00:00
102 12 200 2022-09-01 10:00:00
103 13 260 2022-09-01 12:00:00
104 11 100 2022-09-02 11:00:00
105 12 150 2022-09-02 12:00:00
106 12 1200 2022-09-02 13:00:00
107 11 60 2022-09-03 09:00:00
108 13 380 2022-09-03 09:30:00

3. 计算每个用户的新增积分

  • 用户 11:订单有 380、100、60。
    大于100的只有 380,所以新增积分 = 380。
    新积分 = 1555 + 380 = 1935。

  • 用户 12:订单有 200、150、1200,全部大于100,新增 = 200+150+1200 = 1550。
    新积分 = 12000 + 1550 = 13550。

  • 用户 13:订单有 260、380,全部大于100,新增 = 260+380 = 640。
    新积分 = 6115 + 640 = 6755。

  • 其他用户(10、14、15、16)没有订单,所以没有新增积分,不输出。

4. 最终输出

按积分降序:

user_id point
12 13550
13 6755
11 1935

五、解题思路(不涉及SQL代码)

  1. 找出所有订单中金额 > 100 的记录,因为只有这些订单才能贡献积分。

  2. 按用户分组,计算每个用户的总新增积分(即这些订单的金额之和)。

  3. 与会员表关联,将新增积分加到原有积分上,得到新积分。

  4. 筛选出有新增积分的用户(即总新增积分 > 0 的用户),并按新积分降序排列。

注意:会员表中有些用户没有订单,自然没有新增积分,不需要输出。如果某个用户有订单但都不超过100,那么新增积分为0,也不输出。

发表于 2026-03-10 11:51:44 回复(0)
select r1.user_id, sum(order_price)+point point
from order_tb r1
left join uservip_tb r2
on r1.user_id=r2.user_id
where order_price>100
group by r1.user_id
order by point desc
发表于 2026-03-04 19:00:24 回复(0)
with a as(select distinct user_id,sum(case when order_price>100 then order_price else 0 end) as add_point
from order_tb
group by user_id)
select a.user_id,(a.add_point+ut.point) as point
from a
left join uservip_tb ut
on a.user_id=ut.user_id
order by point desc
求问提交为什么部分通过不了呀
发表于 2026-03-01 18:17:11 回复(0)
with a as (
select
user_id,
sum(if(order_price>100,order_price,0) )as point_sub
from order_tb
group by 1
HAVING point_sub > 0
)

select
a.user_id,
us.point+point_sub as point
from a
left join uservip_tb us
on us.user_id=a.user_id
order by 2 desc
发表于 2026-02-26 03:21:42 回复(0)
select o.user_id,(sum(o.order_price)+u.point) as point
from order_tb o
left join uservip_tb u using(user_id)
where o.order_price>100
group by o.user_id
order by point desc
发表于 2026-02-25 16:53:15 回复(0)
select
t1.user_id,up+point point
from(
select
user_id,sum(order_price) up
from
order_tb
where order_price>100
group by user_id
)t1
left join uservip_tb
on t1.user_id=uservip_tb.user_id
order by point desc;

发表于 2026-02-12 10:03:50 回复(0)
select distinct q1.user_id,
q1.order_prices+q2.point point
from (
    select user_id,sum(order_price) order_prices
    from order_tb
    where order_price>100
    group by user_id
) q1 left join uservip_tb q2 on q1.user_id=q2.user_id
group by user_id	
order by point desc;

发表于 2026-02-07 11:55:08 回复(0)
select X.user_id_ as user_id, sum(X.order_price_) as point
from
(select o.user_id as user_id_, o.order_price as order_price_  from order_tb o
    where o.order_price > 100
union all
select u.user_id, u.point as point_
    from uservip_tb u)X
    group by X.user_id_
    having sum(X.order_price_) not in (select u.point from uservip_tb u)
    order by sum(X.order_price_) desc
发表于 2026-02-04 18:08:17 回复(0)
with tab as(
select user_id,point
from uservip_tb
where user_id in(select user_id from order_tb where order_price>100)
union all
select user_id,order_price from order_tb where order_price>100)

select user_id,sum(point) as point from tab group by user_id order by point desc
发表于 2026-01-28 15:24:14 回复(0)
为什么用SUM(IF)的输出结果和WHERE不一样
发表于 2026-01-23 18:13:00 回复(0)
with t1 as (
    select distinct ot.user_id,
    sum(ot.order_price) over(partition by ot.user_id) as order_price_1,
    ut.point
    from order_tb ot
    left join uservip_tb ut
    on ot.user_id = ut.user_id
    where ot.order_price >= 100
)

select user_id,
sum(point) + sum(order_price_1) as point
from t1
group by user_id
order by point desc
发表于 2026-01-23 15:02:14 回复(1)
select
    ut.user_id,
    sub.order_price + ut.point as point
from(
    select
        user_id,
        sum(if(order_price > 100,order_price,0)) as order_price
    from order_tb
    group by user_id
) as sub
inner join 
    uservip_tb as ut on sub.user_id = ut.user_id
order by 
    point desc


发表于 2026-01-18 19:03:22 回复(0)
with t1 as(
    select 
        user_id,
        sum(case when order_price>100 then order_price else 0 end) as get_point
    from
        order_tb
    group by user_id
)
select 
    t1.user_id,
    point+get_point  as point
from t1 
inner join uservip_tb t2
on t1.user_id = t2.user_id
and get_point > 0 
order by point desc;

发表于 2026-01-17 21:24:15 回复(0)