重庆邮电大学
实验报告
班级:13061801
姓名:张川
学号:2018214201
指导老师:桑春燕
课程名称:数据与算法基础(2)(数据库)
实验地点: A501/502
实验八 综合运用数据库技术解决实际案例
一、实验目的
熟练掌握 SQL 的数据定义/数据操作/查询功能。
综合运用 SQL 处理实际问题。
二、实验要求及任务
按照“个人信息处理考查 12121.xls“中“分摊表”提供的模板统计重庆唯胜 气
象信息有限公司开展“12121”业务情况。具体如下统计规则如下:
1.数据源:共一张报表,见“个人信息处理考查 12121.xls”中“原始数据”。
2.取数规则见:“个人信息处理考查 12121.xls”中 “取数规则”工作表中,即
该 公司在不同报表中取数约定。
3.分摊表说明
1)电信产品类型分成三大类,即:固话、移动、小灵通;
2)在进行分摊表计算时,固话分摊到 “城市”或者“乡村”列小灵通分摊 到“小
灵通”列;移动分摊到“捆绑”或“未捆绑”列。 产品类型与用户类型及分摊
对应关系见表
1.
4. 完成“个人信息处理考查 12121.xls”中“分摊表”的编制。 5.总结并完成实
验报告。
三、实验步骤
1.导入数据
之后一直下一步就行。导入成功截图
(2)根据实验要求修改数据
(1) 修改原始数据表中的地区 将 xxx 电信公司修改为 xxx 比如 万州电信公司 修改为 万
州
(2) 处理不可见字符,如空格 使用 Ltrim trim Rtrim 去除
(3) 处理列数据 将用户类型 改为 相应的 小灵通,移动,固话,
(4) 统计信息,将如下表填满信息
Sql 语句
(1)使用了 replace 函数替换字符串
update `原始数据` set 地区=REPLACE(地区,"电信","")
update `原始数据` set 地区=REPLACE(地区,"电信公司","")
(2)处理空格
SELECT Trim(地区,城市_乡村,是否上网捆,用户类型,账目类型,接入码,用户数,话单樟张数,
通话时长,费用)FROM 原始数据
(3)处理用户类型
UPDATE 原始数据 set 用户类型="小灵通" where 用户类型 like "%小灵通"
UPDATE 原始数据 set 用户类型="移动" where 用户类型 like "%卡式电话%"
UPDATE 原始数据 set 用户类型="固话" where 用户类型 like "%固定电话%"
update 原始数据 set 用户类型="移动" where 用户类型 like "%语音%"
update 原始数据 set 用户类型="小灵通" WHERE `用户类型` like "%PHS%"
(4)统计信息
1)
.先建表
DROP TABLE IF EXISTS `分成前收入`;
CREATE TABLE `分成前收入`
(
`地区` char(5) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
NULL DEFAULT NULL,
`城市` char(4) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci
NULL DEFAULT NULL,
` 农 村 `
varchar(5)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_general_ci NULL DEFAULT NULL,
` 小 灵 通 ` varchar(10) CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci NULL DEFAULT NULL,
` 移 动 未 捆 绑 ` varchar(10) CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci NULL DEFAULT NULL,
` 移 动 已 捆 绑 ` varchar(10) CHARACTER SET utf8mb4 COLLATE
utf8mb4_general_ci NULL DEFAULT NULL,
` 合 计 `
varchar(10)
CHARACTER
SET
utf8mb4
COLLATE
utf8mb4_general_ci NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE =
utf8mb4_general_ci ROW_FORMAT = Compact;
SET FOREIGN_KEY_CHECKS = 1;
2)
.插入数据到 分成前收入 表中
insert into 分成前收入(地区) (SELECT DISTINCT 地区 from 原始数
据 ORDER BY 地区 arc);
update 分成前收入 set 分成前收入.合计=(select sum(费用) from
`原始数据` where 接入码="12121"
and 分成前收入.`地区`=`原始数
据`.`地区` )
update 分成前收入 set 分成前收入.城市 =(select sum(`原始数据
`.`费用`)
from 原始数据 where
`原始数据`.地区=`分成前收入`.`地
区`
and 原始数据.`城市_乡村`='城市' and `接入码`=12121 )
update 分成前收入 set 分成前收入.`农村` =(select sum(`原始数
据`.`费用`)from 原始数据 where
`原始数据`.地区=`分成前收入`.`地
区`
and 原始数据.`城市_乡村`='乡村' and `接入码`=12121 )
update 分成前收入 set 分成前收入.`小灵通` =(select sum(`原始
数据`.`费用`) from 原始数据 where `原始数据`.地区=`分成前收入`.`
地区` and `原始数据`.`用户类型`="小灵通"
and `接入码`=12121 )
update 分成前收入 set 分成前收入.`移动未捆绑` =(select sum(`
原始数据`.`费用`) from 原始数据
where `原始数据`.地区=`分成前
收入`.`地区` and 原始数据.`是否上网捆绑`="未捆绑"
and `接入码
`=12121 )
update 分成前收入 set 分成前收入.`移动已捆绑` =(select sum(`
原始数据`.`费用`) from 原始数据
where `原始数据`.地区=`分成前
收入`.`地区` and 原始数据.`是否上网捆绑`="捆绑"
and `接入码
`=12121 )
四.总结
还是一些 sql 语句不好写,体验到了批量修改字符串,使用了
replace 函数。update `原始数据` set 地区=REPLACE(地区,"电
信","")将所有原始数据表中地区这一列的数据 出现电信这俩
字的,都变为空,然后只要前 2 字。这样比如万州电信公司 就
变为万州。
还使用模糊匹配批量修改字符串。UPDATE 原始数据 set