资讯动态

Access数据分析实战:从Excel迁移到关系型查询的完整指南

发布时间:2026/10/31 7:21:54 来源:尧图企业网站定制
简介《Access 2007数据分析技巧详解》面向希望借助关系型数据库提升数据处理能力的中级用户尤其适合已熟悉Excel、但在数据量增长后遇到扩展性与分析透明度瓶颈的读者。全书由微软认证应用程序开发师迈克尔·亚历山大撰写先对比Access与Excel在可扩展性、数据与呈现分离、数据结构演变及共享处理上的差异再讲解表创建、数据类型、数据导入与查询基础并深入聚合查询、制表/删除/追加/更新等操作查询及交叉表查询的用法同时覆盖查找删除重复记录、填充空白字段、字段连接、文本与大小写转换、去除首尾空格、查找替换等数据转换任务。资源包为1个PDF文件约11.35MB内容完整、便于离线查阅。已有80人学习适合作为查询设计与数据清洗的案头参考。1. 从一份 2007 年的 Access 数据分析手册说起它到底能解决什么手里有一批业务数据几十万行字段十几个Excel 打开就卡透视表刷新一次要等半分钟公式一多直接假死——这种场景下很多人第一反应是上 Python 或者 BI 工具但如果你手上只有 Office其实还有一条被低估的路把数据丢进 Access用查询层做清洗和聚合最后再把结果导回 Excel 出图。这份《Access 2007 数据分析》讲的就是这条路子作者是微软认证应用程序开发师全书围绕「为什么用 Access 做分析」「表怎么建」「查询怎么写」「脏数据怎么转」四个层次展开核心论点很明确Access 在可扩展性、分析过程透明度、数据与呈现分离、数据量上限、结构约束、共享处理这几个维度上比单纯用 Excel 更适合承载中等规模的分析任务。它适合两类人一类是天天和 Excel 打交道、数据量已经顶到天花板的业务分析人员另一类是刚接触关系型数据库、需要一个能立刻上手的关系型数据库查询技巧练手环境的新手。不适合指望它讲 Power Query、DAX 或者现代数据栈的人——这是 2007 年的东西工具链是老的但查询逻辑、数据转换思路、关系建模的基本功不过时。下面按「资源是什么 → 怎么用 → 坑在哪」的顺序拆。2. 为什么选 Access 而不是 Excel八个维度的选型账2.1 数据量与可扩展性的真实边界Excel 2007 的单表上限是 1048576 行、16384 列听起来够用但实际卡死你的不是行数上限是公式重算和透视缓存的性能。一份 30 万行、20 列的明细表加几个 VLOOKUP 和 SUMIFS文件就能膨胀到几十兆每次改一个单元格全表重算。Access 的单表理论上限是 2GB 文件大小Access 2007 的 ACCDB 格式实际单表能扛到百万行级别关键是它把存储和计算分开了数据落在表里计算发生在查询执行时不会因为改一个字段触发全表重算。书里给的判断标准我整理成一张表方便你对照自己的场景维度Excel 更合适Access 更合适数据量几万行以内十万到百万行分析过程一次性、临时性需要反复跑、要留痕数据与呈现混在一起无所谓要求分离报表可重生成数据结构扁平、单表多表关联、有主外键数据演变静态快照持续追加、需要历史功能复杂度简单聚合多步查询、操作查询共享处理单人多人共用同一数据源这张表不是让你二选一而是告诉你什么时候该把数据从 Excel 挪到 Access。我的经验是当你发现自己在 Excel 里反复做同一套清洗动作超过三次就该考虑迁到 Access 用查询固化下来。2.2 关系型建模表结构决定后面所有查询的难度Access 是关系型数据库建表不是把 Excel 列照搬过去就完事。书里强调的第一件事是主键和数据类型每张表要有一个唯一标识自动编号或业务主键字段类型要按实际语义选日期就是日期型别用文本存「2024-01-01」否则后面查询里的日期函数、排序、比较全都会出问题。一个典型的翻车场景从 Excel 导入时金额列里混了「1,234.56」这种带千分位的文本Access 导入时会把它识别成文本型之后你写SUM(金额)得到的是 0 或者报错。正确做法是导入前在 Excel 里把该列转成纯数字或者在 Access 里建一个转换查询先清洗再入表。建表时还要想清楚一对多关系。比如订单表和订单明细表订单表主键是订单号明细表里订单号是外键两张表通过「关系」窗口建立一对多关联并且勾选「实施参照完整性」。这一步不做后面写连接查询时会出现孤儿记录聚合结果对不上。2.3 查询基础从选择查询到聚合查询的递进Access 的查询分几层选择查询筛选列和行、聚合查询GROUP BY、交叉表查询行转列、操作查询生成表、删除、追加、更新。书里的编排是先讲选择查询再讲聚合最后讲操作查询和交叉表这个顺序是对的因为后面的都建立在前面之上。一个最基础的选择查询在 SQL 视图里长这样-- 从订单明细表里筛出 2024 年之后、金额大于 1000 的记录 SELECT 订单号, 产品ID, 数量, 单价, 数量 * 单价 AS 金额 FROM 订单明细 WHERE 下单日期 #2024-01-01# AND 数量 * 单价 1000 ORDER BY 金额 DESC;逻辑说明#...#是 Access SQL 的日期字面量写法和标准 SQL 的单引号不同这是 Access 特有的语法坑数量 * 单价 AS 金额是计算字段Access 查询里可以直接做算术ORDER BY可以引用别名。参数上要注意Access 的 WHERE 子句里不能用 SELECT 里定义的别名必须重复写表达式这是它和很多数据库的差异。聚合查询则是把明细压成汇总-- 按产品统计销售数量和总金额 SELECT 产品ID, SUM(数量) AS 总数量, SUM(数量 * 单价) AS 总金额 FROM 订单明细 GROUP BY 产品ID HAVING SUM(数量 * 单价) 10000;这里HAVING是对聚合结果过滤WHERE是对明细行过滤两者不能混。很多人写错就是把聚合条件塞进 WHERE报「聚合函数不能出现在 WHERE 子句」的错。2.4 交叉表查询行转列在 Access 里的实现交叉表查询是 Access 做报表的利器本质是行转列。比如按月份和产品做销售矩阵行是产品列是月份值是金额。在查询设计视图里选「交叉表查询」指定行标题、列标题、值三个角色即可SQL 视图里对应TRANSFORM ... PIVOT-- 按产品和月份生成销售交叉表 TRANSFORM SUM(数量 * 单价) AS 销售额 SELECT 产品ID FROM 订单明细 GROUP BY 产品ID PIVOT Format(下单日期, yyyy-mm);TRANSFORM指定值字段和聚合方式PIVOT指定列标题来源。注意PIVOT的列是动态的月份多了列就多导出到 Excel 时列数会变做固定模板报表时要留意这一点。另外Format函数返回的是文本排序会按字符串排「2024-10」排在「2024-2」后面需要的话在 PIVOT 里用Month()取数字再拼。3. 数据转换实战脏数据清洗的六个固定动作3.1 查找和删除重复记录重复记录是分析前必清的东西。Access 里有两个层次一是用「查找重复项查询向导」快速定位二是用聚合查询按业务主键分组、COUNT(*) 1筛出重复组。删除时要小心不能直接DELETE全删得保留一条。常见做法是建一个生成表查询把每组里MIN(自动编号)的那条留下来-- 找出每个订单号下重复的明细保留最小 ID 的一条 SELECT MIN(ID) AS 保留ID, 订单号, COUNT(*) AS 重复次数 FROM 订单明细 GROUP BY 订单号 HAVING COUNT(*) 1;拿到「保留ID」列表后再写删除查询DELETE FROM 订单明细 WHERE ID NOT IN (SELECT 保留ID FROM ...)。注意 Access 的删除查询不支持直接对子查询做NOT IN时引用同表稳妥做法是先把保留ID生成到临时表再基于临时表删。3.2 填充空白字段与字段连接空白字段分两种NULL 和空字符串。Access 里IsNull()判断 NULLLen(字段)0判断空串两者要分开处理。填充常用Nz()函数-- 把备注为 NULL 的填成「未填写」同时拼接客户名和订单号 SELECT Nz(备注, 未填写) AS 备注2, 客户名 - 订单号 AS 业务编号 FROM 订单主表;Nz(字段, 替代值)是 Access 特有函数等价于COALESCE是字符串连接符遇到 NULL 时会把 NULL 当空串处理而会让整个表达式变 NULL这是很多人踩过的坑。字段连接常用于生成业务唯一键比如「客户名-订单号」拼起来做匹配键。3.3 文本清洗大小写、空格、查找替换文本转换是书里花篇幅最多的部分因为从业务系统导出的数据经常带首尾空格、大小写不一致、夹杂特殊字符。常用函数组合-- 去首尾空格、统一大写、替换掉全角括号 SELECT UCase(Trim(客户名)) AS 规范客户名, Replace(Replace(地址, , (), , )) AS 规范地址 FROM 客户表;Trim()去首尾空格UCase()/LCase()转大小写Replace()做查找替换。注意Trim()只去空格不去制表符和换行从网页或 PDF 复制来的数据常带Chr(9)、Chr(13)需要嵌套Replace(字段, Chr(13), )处理。批量清洗建议写成更新查询把结果写回原表但更新前一定先备份更新查询没有撤销。3.4 操作查询的四种类型与使用顺序操作查询包括生成表查询、删除查询、追加查询、更新查询。书里给的顺序建议是先用生成表查询把清洗结果落到临时表验证无误后再用追加查询并入主表删除和更新放在最后且必须限定条件。一个典型的数据流转-- 第一步生成清洗后的临时表 SELECT 订单号, UCase(Trim(客户名)) AS 客户名, 数量, 单价 INTO 订单明细_清洗 FROM 订单明细 WHERE 数量 0 AND 单价 IS NOT NULL; -- 第二步把临时表追加回主表主表需先清空或按订单号去重 INSERT INTO 订单明细_正式 (订单号, 客户名, 数量, 单价) SELECT 订单号, 客户名, 数量, 单价 FROM 订单明细_清洗;INTO是生成表查询的写法目标表不存在时自动创建INSERT INTO ... SELECT是追加查询。参数上要注意字段顺序必须一一对应类型要兼容文本追加到数字字段会报类型转换错误。操作查询执行时 Access 会弹确认框批量跑之前建议在「选项」里关掉确认但关掉后就没有后悔药了所以备份是硬性要求。4. 避坑与排查五个真实踩过的坑4.1 导入后数字变文本聚合全为 0现象从 Excel 导入的金额列SUM结果是 0或者排序按字符串排「9」排在「10」后面。原因源列里混了千分位、货币符号或空格Access 判定为文本型。解决导入前在 Excel 里用「分列」或VALUE()转成纯数字导入后在 Access 里用CDbl(字段)或CLng(字段)做一次转换查询再入正式表。4.2 日期条件查不到数据现象WHERE 下单日期 #2024-01-01#返回空。原因字段实际是文本型或者日期格式受系统区域设置影响#2024-01-01#被解析成#2024-01-01 00:00:00#之外的格式。解决先用SELECT DISTINCT 下单日期 FROM 表看实际存储值确认类型文本日期用CDate()转换后再比较跨区域环境统一用#yyyy-mm-dd#格式。4.3 连接查询结果行数暴增现象两张表按订单号连接结果行数远大于明细表。原因连接字段一方有重复值比如订单主表里订单号不唯一一对多变成多对多。解决连接前先对主表按连接键做GROUP BY去重或者确认主表连接键上有唯一索引在关系窗口里勾选参照完整性从源头约束。4.4 更新查询改错数据无法回滚现象更新查询条件写漏了一个AND整表被覆盖。原因Access 的更新查询执行即生效没有事务回滚入口除非用 VBA 包事务。解决执行前先复制一份表做备份把更新查询的WHERE条件先用选择查询验证一遍确认命中行数和预期一致再改成更新复杂更新拆成多步小查询。4.5 交叉表列名动态导致导出错位现象每月跑同一个交叉表导到 Excel 后列顺序变了模板对不上。原因PIVOT的列按数据动态生成某月没数据就少一列。解决在 PIVOT 前用固定维度表左连接补齐所有月份或者导出后在 Excel 侧按列名匹配而不是按位置取数固定报表场景干脆不用交叉表改用多个聚合查询拼结果。5. 进阶把查询层固化成可复用的分析流水线书里最后落到的是「数据与呈现分离」这个理念落到实操上就是把所有清洗和聚合逻辑固化成命名查询Excel 只负责连进来取结果出图。具体做法是建一组查询按依赖顺序命名比如qry_01_清洗明细、qry_02_聚合月度、qry_03_交叉表后面的查询引用前面的查询形成一条流水线。这样源数据更新后只需要重新打开依赖链末端的查询整条链自动重算不用手工重复每一步。验证流水线是否可靠我一般用三个检查点一是行数守恒清洗前后明细行数差异要能解释删了多少重复、过滤了多少无效二是金额对账聚合查询的总金额和源表SUM一致三是抽样比对随机抽十条记录手工核对清洗结果。这三个检查点写成固定查询每次数据更新后跑一遍比肉眼扫一遍靠谱得多。一个实用技巧是把参数查询和流水线结合让同一套查询支持不同时间范围-- 参数查询运行时弹出输入框指定起止日期 SELECT 产品ID, SUM(数量 * 单价) AS 销售额 FROM 订单明细 WHERE 下单日期 BETWEEN [请输入开始日期:] AND [请输入结束日期:] GROUP BY 产品ID;方括号里的文字就是提示语运行时弹出输入框输入的值按日期类型参与比较。参数查询的好处是同一份查询可以反复用不用每次改 SQL坏处是不能被其他查询直接引用参数需要外部传入所以流水线里参数查询一般放在最末端做展示层中间层用固定条件的查询。从那以后我每次把 Excel 数据往 Access 里搬都强制先走一遍「类型检查 → 去重 → 清洗 → 生成临时表 → 对账」这五步哪怕数据看起来再干净也不跳过因为翻车基本都翻在「看起来没问题」的那一列上。希望这套流程帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑