复原表中数据

第二届全国高校绿色计算大赛 预赛第一阶段(SQL)复原表中数据

本关任务:某店铺网站的数据库系统中现有四张表记录着用户信息及其消费情况,由于运维人员的疏忽,会员表中部分数据丢失了,现在请你将丢失的数据进行恢复。

会员表中数据统计注意点:
  1. 丢失数据可能是整条记录或只丢失积分
  2. 现会员表中还存有部分数据,但积分可能不准确
  3. 会员积分只对会员消费有效(消费1元为1个积分)
  4. 会员积分 = 所有消费记录 - 退货记录
  5. 只要为本店会员则在会员表中都会有记录,若无消费积分为0
  6. 会员表的数据顺序按card_id升序显示
表结构说明
用户表user:
字段名类型说明约束
namevarchar用户名主键
ageint年龄非空
sexvarchar性别非空
ismemberint是否为会员(0表示不是,1表示是)默认为0
card_idint卡号非空
会员表member:
字段名类型说明约束
card_idint卡号主键
creaditsint积分非空
销售表sales:
字段名类型说明约束
namevarchar用户名非空
expense_moneyint消费金额非空
退货表back:
字段名类型说明约束
card_idint卡号主键
return_moneyint退款金额非空
代码:
##########  开始编写 SQL  ##########
#将member表数据清空
#丢失数据可能是整条记录或只丢失积分现会员表中还存有部分数据,但积分可能不准确
delete from member; 

#向member中插入card_id和creadits,
#card_id是user中为会员的card_id,
#sum(expense_money)是sales表中会员的所有消费,用sum是因为会员可能消费多次
#会员积分只对会员消费有效(消费1元为1个积分)

insert into member(card_id,creadits) 
select user.card_id,sum(expense_money)
from user,sales
where user.ismember=1 and user.name=sales.name
group by sales.name;

#只要为本店会员则在会员表中都会有记录,若无消费积分为0

insert into member(card_id,creadits)
select user.card_id,0
from user 
where user.ismember=1 and not exists (
select card_id from  member where user.card_id=member.card_id);

#更新member表,会员积分 = 所有消费记录 - 退货记录
update member
inner join back
on member.card_id=back.card_id
set member.creadits=member.creadits-back.return_money;

#会员表的数据顺序按card_id升序显示(如果平台会自己输出可直接忽略)
select * from member
order by card_id;


注释较多(⊙o⊙)…
方法不唯一,仅供参考。
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值