首页 > 其他分享 >如何快速对比两张Excel报表

如何快速对比两张Excel报表

时间:2023-08-06 10:22:31浏览次数:48  
标签:prd 报表 报告 Excel 两张 test id match

背景

最近由于工作原因,要切换系统,新老系统都会产生excel报表,上线前需要验证新老系统产生的报表数据的一致性,作为测试的一部分。理论上,是要求新老系统新生成的报表要一模一样,要是不一致的地方,也需要标注出合理的解释。

本文地址:https://www.cnblogs.com/hchengmx/p/17609130.html

难点

  1. 报表多、数据多、报表中的字段多;
  2. 要对比多天的数据,会有很多字段上的不一致,而这些差异又是合理的,要是每天都标注的重复的记录的话,会比较耗费精力;
  3. 新老系统是有可能的计算方式,是有可能有不一致的地方(备注;
  4. 展示方式上,有没有更好的方式?
  5. 要对比多天的数据,同一天的数据也有可能会多次生成,每次需要快速对比,并且得到所有不一致的字段

要求

  1. 体现数据量差异;
  2. 能快速捞出来所有不一致的字段;
  3. 能根据已保存的错误信息,快速更新已知的原因;

方法

最开始想到的是用vlookup,通过用唯一的key把一张表的数据捞到另外一张表格里面,再利用IF条件筛选出不一致的字段,要是有合理的解释再备注上去。

这样的缺点在于:

  1. vlookup可能会需要多个字段关联起来才能确定唯一的值,需要把最开始的报表添加上额外的字段;
  2. 会漏掉一些数据量不一致的,分三种情况,1. 老系统有,新系统没有;2. 老系统没有,新系统有;3. 同样的数据,老系统2条记录,新系统1条记录;
  3. 会添加很多列,包括另外一张表的字段,整个对比表格就会很大,不直观;

目前采用的方式:

  1. 通过把两张excel导入数据库中两张表里面;

这一步可以使用把excel导入数据库的功能,把两张excel表格粘贴进数据库中,e.g. table_prd, table_test

navicat, dbeaver等主流数据库操作软件都有类似的功能。

  1. 捞出来条数不一致的数据;
# 多的
select * from 报告_test test left join 报告_prd prd on test.`match_id`=prd.`match_id` 
where prd.`match_id` is null;
# 少的
select prd.* from 报告_test a right join 报告_prd prd on test.`match_id`=prd.`match_id`
where test.`match_id` is null;

# 条数不一致的
select * from (
select a.`match_id`,count(1) as star from 报告_test  a  group by a.`match_id`
) aa join (
select a.`match_id`,count(1) as otc from 报告_prd  a  group by a.`match_id`
)bb on aa.`match_id`=bb.`match_id` and aa.star<>bb.otc
;
  1. 创建一张错误的表,根据匹配的字段,把所有不一致的字段捞到另外一张表中;

包括以下几列:match_id, 字段名称, 测试环境的值, 生产环境的值, 备注。

建表语句

DROP TABLE IF EXISTS  errordata0703;

CREATE TABLE `errordata0703`  (
	`match_id` varchar(100) NULL,
	`字段` varchar(50) NULL,
	`test` varchar(500) NULL,
	`prd` varchar(500) NULL,
	`remark` varchar(500) NULL
)
;
insert into errordata0703 select 报告_test.match_id, '客户名称' as 字段, 报告_test.客户名称 as star,报告_prd.客户名称 as otc from 报告_test a join 报告_prd b on 报告_test.`match_id`=报告_prd.`match_id` where 报告_test.客户名称<>报告_prd.客户名称;
  1. 维护一张历史错误原因的表,更新 remark/备注 字段

这张表用来把历史已经调查过的问题更新的最新的结果里面。包括以下几个关键信息

  1. 类类型:是哪张报表?
  2. 字段:
  3. 匹配的字段:
  4. 匹配的key值:
  5. remark:

最后就可以根据 "已知原因" 来更新了。

标签:prd,报表,报告,Excel,两张,test,id,match
From: https://www.cnblogs.com/hchengmx/p/17609130.html

相关文章

  • Java 利用poi读取excel行数,列数
    一般读取行总数时,会调用getLastRowNum(),读取列总数时,会调用getLastCellNum(),但是这两个方法的返回值有点区别。sheet.getLastRowNum();//返回最后一行的索引,即比行总数小1 row.getLastCellNum();//返回的是最后一列的列数,即等于总列数getLastRowNum():如果she......
  • 从excel读数据的格式
    问题:从excel中读取的数据应是什么格式呢?   1pytest中需要参数化时,需要的[(valuea,valueb)(valuex,valuey)]-------------列表内是元祖importpytestdefadd(x,y):[email protected]("x,y,expected",[(1,1,2),(2,3,5),......
  • 读excel测试用例;登录;做pytest 请求
    1.从excel中读数据 返回【{字典}{字典}】;当传参数时,可以获得对应单元格内容importxlrdimportjsonfromconfigs.configsimportHOSTfromutils.md5importget_md5#在创建excel时,将登录接口的返回结果粘贴到excel时需要“只粘贴文本”#将excel实例化defget_exce......
  • Excel分类后数字类型的内容值后面变为0
    背景在工作中经常遇到从日志或者其他地方拷贝过来的文本,里面使用其他分隔符进行分割。然而,使用Excel的分列功能进行分列后,发现数字类型的数值后面变为0。有时候我们就是需要原先的数值,该怎么办呢?比如,有如下的数据,以竖线|作为分割符。|员工编号|销售量|商品单价|销售额|20180......
  • Excel中文本型数字转换为数值型数字的方法
    背景工作中经常遇到需要将Excel中的内容进行求和或者其他计算,但是由于格式为文本,无法进行计算和求和。单元格的左上角都有绿色小三角,且用自动求和公式计算无法计算结果,显示为0,说明单元格格式为文本。1、直接将文本转化成数字需要转换的数据,左上角会出现黄色感叹号,点击,并选择......
  • excel递归读取目录并输出
    添加依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> ......
  • Excel中Hyperlink函数的使用
    Hyperlink函数是将文本形式的链接转换为超链接。调用格式:=HYPERLINK(链接,标题)或者:=HYPERLINK(链接)具体可参考Hyperlink函数Microsoft官方文档视频演示:......
  • Vuejs+WebApi导出Excel
    前后端分离,前端Vuejs,后端.Net6WebApi后端代码1publicclassSalesReportController:BaseController2{3privateSerilog.ILogger_log=GetLogger<SalesReportController>();4privatereadonlyISqlSugarClient_db;5privateIHostEnvironme......
  • C# 解决导出Excel长数字变成10次幂
    在做项目的时候遇到一个bug,当编号(仅针对纯数字)长度达到一定长度,比如超过11位之后,导出Excel后就转换成了10的幂次方。这是Excel特有的转换,而且当数字的位数达到15,以后的数字就会全部转化成0,造成精度的缺失。这显然是不符合要求的。 原始的赋值代码是这样的。dr["编号"]......
  • 用navicat导出数据csv比excel快多了
    ......