一维表格的合并,更多的是将这些表格数据堆积在一起,形成一个包括全部数据的总表。这种情况下可以汇总全部字段(假如这些工作表字段个数一样),或者汇总部分需要的字段。
一维表格合并的常规方法主要是现有连接+SQL方法,以及后面要介绍的VBA方法和Power Query方法。本节主要介绍如何使用连接+SQL方法快速汇总大量一维工作表。
如果要汇总某个工作簿内的指定的工作表的全部字段全部数据,可以使用下面的SQL语句:
select * from [表1$] union all select * from [表2$] union all select * from [表3$] union all …… select * from [表n$]
这是SQL的基本语句,select表示查询数据的意思,型号(*)表示全部字段,from表示从哪里去查询数据,工作表名称后添加后缀$,用方括号括起来,表示要查询的工作表。
图2-26是一个简单的例子,是四种费用的明细表,现在要将这几个表数据汇总到一个工作表上。
图2-26 四个要汇总的一维表,字段相同
下面是合并汇总的主要步骤。
步骤1 选择“数据”→“现有连接”命令,如图2-27所示。
图2-27 “现有连接”命令按钮
步骤2 打开“现有连接”对话框,如图2-28所示。
步骤3 单击对话框左下角的“浏览更多”按钮,打开“选取数据源”对话框,从文件夹中选择要汇总的工作簿,如图2-29所示。
步骤4 单击“打开”按钮,打开“选择表格”对话框,如图2-30所示。
图2-28 “现有连接”对话框
图2-29 “选取数据源”对话框
步骤5 在“选择表格”对话框中,保持默认选项,单击“确定”按钮,打开“导入数据”对话框,如图2-31所示。
步骤6 在“导入数据”对话框中,单击左下角的“属性”按钮,打开“连接属性”对话框,如图2-32所示。
步骤7 切换到“定义”选项卡,然后在命令文本框中输入下面的SQL语句,如图2-33所示。
select * from [水电费$] union all select * from [车船使用税$] union all select * from [土地使用税$] union all select * from [利息支出$]
图2-30 “选择表格”对话框,保持默认
图2-31 “导入数据”对话框
图2-32 “连接属性”对话框
图2-33 输入命令文本
步骤8 单击“确定”按钮,返回“导入数据”对话框,选中“表”和“新工作表”单选按钮,如图2-34所示。
图2-34 选择“表”和“新工作表”
步骤9 单击“确定”按钮,就得到四个工作表数据的合并汇总表,如图2-35所示。
图2-35 四个工作表数据合并汇总表
当需要把每个工作表中满足条件的数据提取出来,并汇总到一起,可以在SQL语句中添加where条件字句:
select * from [表$] where 条件表达式
例如,要从工作表“销售明细”中查找地区是“华北”和“华东”,门店性质是“自营”的数据,SQL语句如下:
select * from [销售明细$] where (地区='华北' or 地区='华东') and 性质='自营'
注意条件之间的逻辑关系,合理使用and、or以及括号组合。
图2-36中的示例要求汇总各月数据到一个表中,地区条件是华北,产品类别是家电类和服饰类。
图2-36 示例数据1
具体合并方法与2.2.1节介绍的完全相同,不过此时的SQL语句变为下面的情形:
select * from [1月$] where 地区='华北' and (产品类别='家电类' or 产品类别= '服饰类') union all select * from [2月$] where 地区='华北' and (产品类别='家电类' or 产品类别= '服饰类') union all select * from [3月$] where 地区='华北' and (产品类别='家电类' or 产品类别= '服饰类')
合并汇总的结果如图2-37所示。
图2-37 汇总结果1
在select语句中,星号(*)表示全部字段,如果要汇总指定字段的数据,则需要列出具体字段名称了,参考如下。
select 字段1,字段2,字段3,……,字段n from [表$]
图2-38的示例数据是6个月的工资表中,要求将每个人的个税、社保和公积金合并到一个工作表。
图2-38 示例数据2
此时,SQL语句如下,汇总结果如图2-39所示。
select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[1月$] union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[2月$] union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[3月$] union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[4月$] union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[5月$] union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[6月$]
图2-39 汇总结果2
如果要汇总部分字段的部分满足条件的数据,可以在SQL中添加where子句。例如,在上面的例子中,要把合同工各月的社保和公积金汇总到一张表上,SQL语句如下:
select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[1月$] where 合同类型='合同工' union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[2月$] where 合同类型='合同工' union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[3月$] where 合同类型='合同工' union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[4月$] where 合同类型='合同工' union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[5月$] where 合同类型='合同工' union all select 月份,姓名,合同类型,个人所得税,社保金,公积金 from[6月$] where 合同类型='合同工'
汇总结果如图2-40所示。
图2-40 汇总结果3
如果要在汇总表中添加源表中不存在的新字段,则可以使用下面的SQL语句:
select *,’2020年’ as 年份,’1月’ as 月份 from [表1$]
这个语句中添加了两个新字段:“年份”和“月份”,该字段下的数据分别是文本“2020年”和“1月”。
这种情况是常见的,因为很多情况下,我们在工作表名称中说明数据的归属,例如,每个月工作表,并没有月份字段,而是在工作表名称中标明月份。
在上面的例子中,如果各月份工作表中没有月份字段,如图2-41所示。
图2-41 每个月发工资表中,没有字段“月份”
那么将各月份工资表汇总起来,并添加一个月份字段,SQL语句如下:
select '1月' as 月份,* from[1月$] union all select '2月' as 月份,* from[2月$] union all select '3月' as 月份,* from[3月$] union all select '4月' as 月份,* from[4月$] union all select '5月' as 月份,* from[5月$] union all select '6月' as 月份,* from[6月$]
图2-42就是一个汇总示例结果。
图2-42 在汇总表添加新字段“月份”
现有连接+SQL语句的方法,对于汇总大量工作表,是很实用的工具,操作简单,只需了解SQL基本语句(select语句)就能应用。不过,也有几个重要的注意事项需要了解。
如果在SQL中使用了星号(*)来代替所有字段,那么就需要保证每个工作表中,字段个数和字段顺序必须完全相同,否则就会出现错误。
如果这些工作表的字段个数和顺序不同,就不能使用星号选择所有字段,而必须使用具体的字段列表“字段1,字段2,字段3,字段4……”获取这些工作表都存在的字段数据。
很多人喜欢在数据区域外输入一些验证计算公式或者数据,这会造成实际数据区域大小并不是用户看见的大小,即使使用Delete键删除了这些单元格数据也没用。
检查实际数据区域大小,可以使用Ctrl+End键,看看定位到哪个单元格。
现有连接+SQL方法汇总工作表,既可以是当前工作簿的N个工作表,也可以是其他工作簿的N个工作表(不打开工作簿就可以汇总),而且得到的汇总表是与数据源动态链接的,只要在汇总数据区域内右击,在弹出的快捷菜单中执行“刷新”命令,如图2-43所示,就可以对汇总结果进行更新。
图2-43 快捷菜单的“刷新”命令
现有连接+SQL语句方法中,在最后一步的“导入数据”对话框中,可以选择“数据透视表”选项,如图2-44所示,这样得到的就是一个数据透视表,而不是一个数据明细表,因此可以创建数据合并与透视分析于一体的自动化数据分析模板。
图2-44 选择“数据透视表”