使用SQL语句进行数据比对

本文介绍了一种利用SQL语句快速处理Excel数据的方法,通过整合补考成绩与欠费信息两个表格,高效筛选出符合学校规定的各类学生名单。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       数据比对在办公应用中非常普遍,常见的是人工比对,不仅费时费力,还无法避免会出现差错。
       今日,教务处传过来两张Excel表格,一张是补考成绩汇总表,主要有以下几列数据:
            系部、班级、学生学号、学生姓名、性别、课程名称、成绩、学期、补考成绩、欠费
      另一张表是欠费表,主要有以下几列数据:
           系部、班级、学号、姓名、欠费费用
       根据学校的规定,只有不欠费、补考及格的学生,学生成绩才记入教务系统。所以教务希望能够筛选出那些欠费的学生名单。如果照他们以往做,肯定采用先到欠费表找到欠费学生学号或姓名,再到补考成绩表中查找到指定行再做标记,纯粹手工做法,费时费力。所以我就对他们说了,数据传过来,我帮你们做,使用SQL语句,几分钟就能搞定。
      软件工具准备:Excel, Access,Database Tour Pro
      具体做法如下:
      第一步:建立一个Access文件,将这2张Excel表的数据导入到Access,一张表名是“总表”,一张表名是“欠费”。
      第二步:作欠费标记:

update [总表] A, [欠费] B
set 欠费=''

where A.学生学号=B.学号

      基本上到此就搞定了,使用Database Tour导出为Excel表就可以了。下面几步是为了输出各种不同要求的表。如欠费且及格学生名单、欠费且不及格学生名单、不欠费且及格学生名单、不欠费且不及格学生名单等
      第三步:在[总表]中增加“补考成绩标记”字段,整型
      主要是因为补考成绩中有缺考的(null)、有百分制成绩,有及格、不及格等5级分制成绩,是字符型。为方便筛选不及格成绩,又懒得去查转换函数,Access的SQL语句中又没有Case语句,所以就设了这么一个字段。使用以下SQL语句进行转换

update [总表]  --缺考记作-1
set 补考成绩标记=-1
where 补考成绩 is null

update [总表]  --不及格记作40
set 补考成绩标记=40
where 补考成绩 is not null
and 补考成绩='不及格'

update [总表]  --百分制的成绩使用实际成绩表示
set 补考成绩标记=Cint(补考成绩)
where 补考成绩 is not null

and 补考成绩>='0' and补考成绩<='99'

update [总表]  --及格以上的成绩记为60
set 补考成绩标记=60
where 补考成绩 is not null
and 补考成绩>'99' and补考成绩<>'不及格'

          第四步,就可以使用SQL语句输出各种要求的Excel表了
输出不欠费且补考及格的学生名单:
 

Select * from [总表]
Where (欠费<>''  and 欠费 is null)
      
and 学期='T060702'

      
and 补考成绩标记>=60
order by id

输出不欠费且补考不及格的学生名单:

Select * from [总表]
Where (欠费<>'' or 欠费 is null)
      
and 学期='T060702'

      
and 补考成绩标记<60
order by id

输出欠费且补考及格的学生名单:

Select * from [总表]
Where 欠费=''
      
and 学期='T060702'
      
and 补考成绩标记>=60
order by id

输出欠费且补考不及格的学生名单:

Select * from [总表]
Where 欠费=''
      
and 学期='T060702'
      
and 补考成绩标记<60
order by id

 OK,搞定。

根据您提供的文档内容,这里有一个具体的SQL检索案例,涉及到四个表(设备表a、任务表b、任务详情表c、定时表d)的复杂查询: 1. **任务使用状态**: - **待使用**:任务没有绑定设备。 - **使用中**:设备绑定了任务ID。 - **已过期**:当任务绑定的定时表里的数据`dateType`字段没有0时,查询`dateType`=1的数据,并按`endDate`排序,取时间最久的一条数据与当前时间对比,若小于当前时间,则认为任务已过期。 2. **SQL查询**: - 首先,可以通过子查询或连接操作来实现上述逻辑。例如,判断任务是否过期的SQL语句可能如下: ```sql SELECT b.task_id, b.status FROM b LEFT JOIN d ON b.id = d.task_id WHERE ( SELECT COUNT(*) FROM d WHERE d.task_id = b.id AND d.dateType = 0 ) = 0 AND ( SELECT endDate FROM d WHERE d.task_id = b.id AND d.dateType = 1 ORDER BY endDate DESC LIMIT 1 ) < NOW() ``` - 判断任务是否待使用SQL语句可能如下: ```sql SELECT b.task_id FROM b LEFT JOIN a ON b.id = a.task_id WHERE a.task_id IS NULL ``` - 判断任务是否使用中的SQL语句可能如下: ```sql SELECT a.device_id, b.task_id FROM a INNER JOIN b ON a.task_id = b.id ``` 3. **合并查询**: - 可以通过`UNION`操作符将上述查询结果合并,确保最终结果集中没有重复数据。 4. **注意事项**: - 在实际应用中,可能需要根据具体业务需求调整SQL语句,例如添加更多的过滤条件或优化性能。 希望这些信息对您有所帮助!如果您有更多具体的问题或需要进一步的帮助,请随时告诉我。更多详细信息和讨论,您可以参考[原文链接](https://ask.youkuaiyun.com/questions/8172105?weChatOA=weChatOA1)。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值