使用 SQL 实战处理2020国赛C题数据
前天本人发表了一篇介绍 SQL 入门以及进阶的文章,希望对大家入门有用。但只看不练帮助不会特别大,今天我就特地找了今年国赛C题的数据,来进行简单的处理,让大家更早的接触实战。(之前那篇文章虽然写的比较多和杂,但真正应用到数据处理的时候,很多都用不到,所以不要怂哦~)
-
工具
本人使用的是 DataGrip,优点是界面比较符合我的风格,和 Pycharm,IDEA,WebStorm 等都是 JetBrain 系列的,还有代码提示补充等功能。缺点就是占内存。用其他的软件也是可以的,只要能连数据库,能写SQL语句。
CMD也可! -
数据
这次使用的是2020年国赛C题数据,可以从官网上进行下载,也可以使用这里的数据
-
数据导入
虽然之前的文章提到了如何从 Excel 中导入数据,但文件中的 Excel 有多个 sheet 以及 表头,操作有点麻烦,这里我就用了一个比较笨的方法。如果有比较简单的方法还请大家告知。
- 将 文件中的 xlsx 数据文件另存为 csv 文件,这时候他会提示选定的文件不包含多份工作表,也就是说它不能把多个 sheet 全都保存在 csv文件,只会保存当前sheet,点击确定即可。这也就表明每一个 sheet 都要进行一次这样的操作。
-
这里只对 DataGrip 的导入进行讲解,其他软件的可以自行百度。
右击建立的table,table的键以及属性要与导入数据的列相对应,即键的个数与列的个数对应,键的类型要符合实际。
选中要导入的csv文件,接下来会出现以下界面,如果第一行是列的名字,就选择第一行是头的选项,列也是一样的道理,接着把 编码方式 从 UTF-8 改成 GBK,最后导入即可。
如果导入过程出错的话,很大可能是因为键的数据类型与导入数据类型不匹配,比如 A00297 为 float 类型的话 极有可能是要出错的,一般情况下,table建立的时候书写的键的顺序 与 csv文件列从左到右的顺序 相对应。
-
数据查询提取
这里以企业信息表以及进项发票信息表为例,来进行简单的处理
- 建数据库和表
show databases;
create database baseC;
use baseC;
# 企业信息表
create table BusinessInfo
(
code varchar(5), # 企业代号
name varchar(30), # 企业名称
credit varchar(2), # 信誉评级
break varchar(5) # 是否违约
);
# 进项发票信息表
create table inProfit
(
code varchar(5), #企业代号
number varchar(10), # 发票号码
date date, # 开票时间
targetCode varchar(10), #销方单位代号
money float, #金额
tax float, #税额
sum float, #价税合计
status varchar(10) # 发票状态
);
- 处理企业信息表
# 统计企业数量
select count(*)
from BusinessInfo;
# 查找未违约的企业数 96
select *
from BusinessInfo
where break = '否';
# 查找违约的企业数 27
select *
from BusinessInfo
where break = '是';
# 查找 A 等级的企业数 27
select count(*)
from BusinessInfo
where credit = 'A';
# 查找 B 等级的企业数 38
select count(*)
from BusinessInfo
where credit = 'B';
# 查找 C 等级的企业数 34
select count(*)
from BusinessInfo
where credit = 'C';
# 查找 D 等级的企业数 24
select count(*)
from BusinessInfo
where credit = 'D';
- 进项发票信息表
# 查找企业的 总交易额 总税额等
select code as '企业', sum(money) as '企业总金额', sum(tax) as '企业总税额', sum(sum) as '企业价税合计'
from inProfit
group by code;
# 查找 企业的交易数量
select code as '企业', count(*) as '交易数量'
from inProfit
group by code;
# 查找企业的 总交易额 总税额等 并按照企业总金额升序排列
select code as '企业', sum(money) as '企业总金额', sum(tax) as '企业总税额', sum(sum) as '企业价税合计'
from inProfit
group by code
order by sum(money);
# 查找 企业的交易数量 并按照交易数量升序排列
select code as '企业', count(*) as '交易数量'
from inProfit
group by code
order by count(*);
select code as '企业',
YEAR(date) as '年份',
sum(money) as '企业总金额',
sum(tax) as '企业总税额',
sum(sum) as '企业价税合计'
from inProfit
group by code, YEAR(date);
# 按照年份查找企业的 总交易额 总税额等
select code as '企业',
YEAR(date) as '年份',
MONTH(date) as '月份',
sum(money) as '企业总金额',
sum(tax) as '企业总税额',
sum(sum) as '企业价税合计'
from inProfit
group by code, YEAR(date), MONTH(date);
# 按照年份查找企业的 总交易额 总税额等
select code as '企业',
YEAR(date) as '年份',
sum(money) as '企业总金额',
sum(tax) as '企业总税额',
sum(sum) as '企业价税合计'
from inProfit
group by code, YEAR(date);
# 按照年份查找企业的 总交易额 总税额等 丢弃无效发票
select code as '企业',
YEAR(date) as '年份',
sum(money) as '企业总金额',
sum(tax) as '企业总税额',
sum(sum) as '企业价税合计'
from inProfit
where status = '有效发票'
group by code, YEAR(date);
# 按照年份月份查找企业的 总交易额 总税额等 丢弃无效发票
select code as '企业',
YEAR(date) as '年份',
MONTH(date) as '月份',
sum(money) as '企业总金额',
sum(tax) as '企业总税额',
sum(sum) as '企业价税合计'
from inProfit
where status = '有效发票'
group by code, YEAR(date), MONTH(date);
-
小结
上面得到的数据不多,核心之处就是针对不同的企业将其营业额等数据根据年或者月为单位进行求和,以便于后面的预测分析。其他未处理的表也就是按照这个套路来,简短的几行代码就把数据提取出来了,想想自己当时写了几百行代码还没有提取出来的狼狈样子,数据库真是相见恨晚啊!如果大家对C题还有什么想提取的数据,我们可以一起讨论,一起进步哦~
另外本文所涉及的代码以及提取的数据结果我已经打包有需要的请自取~
https://pan.baidu.com/s/12fg3BlhwHw5oN9OA0UdxRw提取码: anee