资讯详情 PowerBI实验数据包实操:从Power Query清洗到DAX度量值
📅 2026/10/26 22:55:18
简介这是一套 Power BI 数据分析与可视化实验数据专为课堂教学和自学而整理覆盖了从连接数据源、清洗与集成数据、建立关系模型、编写 DAX 度量值到设计交互式仪表板的完整流程。压缩包共 66 个文件内容非常典型41 个 pbix 格式的 Power BI 工程文件15 个 xlsx 格式的原始数据工作表4 个可用于扩展图表的 pbiviz 自定义可视化插件还包含公司产品体系图片、SQL 数据库脚本及 HTML 网页数据源整体大小约 46.9MB。原始数据部分提供了成绩、客户信息、会员信息、销售任务、员工个人信息、自动售货机、商品信息、销售统计、省份利润等多个业务主题的练习数据自定义可视化效果集成了箱线图、雷达图、子弹图、KPI 指示器等高级图表结果文件中则收录了获取 Excel/MySQL/Web 数据、使用 M 语言获取网络分页数据、数据清洗、数据集成、客户年龄泛化等操作以及零售销售数据分析年度任务额、客单价、销售额钻取、会员信息分析、自动售货机案例和二十余种常用可视化图表漏斗图、散点图、瀑布图、树状图等的完整实验项目。已有 1680 人学习下载适合需要边学边练或对照成品报表快速提升 Power BI 实战能力的读者无论是课程作业还是项目参考都能从中获得清晰的操作路径和数据展示思路。1. PowerBI数据分析与可视化实验数据包它是练手捷径不是交差作业PowerBI数据分析与可视化实验数据包在高校实训和数据分析课程里几乎人手一份但大多数人把它当成“照着PPT拖几个图表交差”的作业。实际上这个rar里那几张普通的业务表——订单明细、产品维度、区域维度——把数据清洗、模型关系、DAX度量值、图表交互全部串成了一条线是一个可以直接对标数据分析岗位日常任务的练手素材。它教的不只是“怎么做图”更是“做完图怎么自圆其说”。如果你正在学Power BI想要一个能写进简历的数据分析项目或者工作了几年还停留在“只会拖字段”的状态这份资源和下面的实操过程都能帮上忙。2. 数据导入与清洗Power Query是把“脏表”变成“模型”的第一道工序实验数据包里的表直接拖进Power BI Desktop当然能显示但拖进去的后果是日期列不能按月下钻、客户名称带着空格导致计数翻倍、宽表没法透视。我第一次做实验报告就是直接拖表做到一半发现所有视觉对象都在算错数只能回头重做。从那以后所有数据进Power BI之前都要先经过Power Query这一道工序。2.1 解压后先做三件事查文件格式、查字段类型、查脏字符第一步是看文件是xlsx还是csv。xlsx用Power Query读取没问题csv要注意编码——我拆过的实验数据包csv有UTF-8也有GBK导入后中文变乱码时去“文件→选项和设置→数据源设置→区域设置”把文件原始格式改成对应编码再重载就行。第二步是目检字段类型在Excel里打开选中订单日期列看它是文本还是真日期文本型日期要先用“分列”改成日期否则Power BI里排序会按字符串排2024/9/1会排在2024/1/5前面。第三步是检查编码列客户编码、产品编码这类维度表主键经常会带不可见空格或全角字符后面建关系时匹配不上问题往往就出在这。我一般的处理顺序是先清一段Power Query步骤骨架如下let 源 Excel.Workbook(File.Contents(C:\实验数据\销售明细.xlsx), null, true), 销售明细_表 源{[Item销售明细,KindTable]}[Data], // 订单日期和销售额强制成目标类型避免文本型日期和数字 已替换类型 Table.TransformColumnTypes(销售明细_表,{{订单日期, type date}, {销售额, type number}}), // 客户名称去掉前后空格第三个参数固定为文本类型 已清理名称 Table.TransformColumns(已替换类型,{{客户名称, Text.Trim, type text}}), // 按订单号去重保证事实表没有重复行 已删除重复 Table.Distinct(已清理名称, {订单号}) in 已删除重复这段M代码做了四件事第一步用Excel.Workbook打开xlsx并定位到名为“销售明细”的工作表第二步把订单日期强制成日期类型、销售额强制成数值类型避免文本型日期和文本型数字导致的排序、汇总错误第三步用Text.Trim清掉客户名称前后的空格再通过第三个参数type text固定列类型第四步按订单号去重保证事实表里没有重复记录。参数上要注意TransformColumnTypes第二个参数是“列名目标类型”的记录列表Power Query允许一次改多列比逐列右键设置快得多TransformColumns的第三个参数传type text是让清洗后的列保持文本类型不传的话列类型有时会被自动推断成其他类型。数据文件的列名如果和实验包里不一致把代码里的“销售明细”“订单日期”“客户名称”改成实际看到的字段名再执行即可。另外注意时间点如果销售明细里有一千行这里Distinct按订单号去重后行数应该等于实际订单数如果行数跟预期差太多说明订单号本身存在空值或格式问题需要回到Excel再检查一次别在这里硬扛。2.2 宽表变窄表把“一月到十二月”变成真正的月份维度实验数据包里特别容易出现的“坑表”是一列叫1月、一列叫2月……一直到12月销售额分布在十二列里。这种宽表直接拖进可视化月份没法作为维度字段因为维度必须是一列“月份”而不是十二个列名。解决办法是逆透视。在Power Query编辑器里选中订单号、订单日期、客户名称这些不需要变的列右键选择“逆透视其他列”Power Query就会把十二列批量转换成一个“属性”列和一个“值”列属性列里是各个月的名称值列里是对应销售额。等价代码如下已逆透视 Table.UnpivotOtherColumns( 已删除重复, {订单号, 订单日期, 客户名称}, 月份, 销售额 )参数说明第一个大括号里是需要保留的固定列这些列不参与转换第二个参数“月份”是逆透视后生成的属性列名建议用中文方便后面写DAX第三个参数“销售额”是值列名。逆透视看起来只是一个小操作但实验报告里80%的“销售趋势按时间变化”图表都依赖这一步如果你在可视化里找不到月份字段优先回来检查表是不是没做过逆透视。2.3 合并查询与追加查询什么时候合并什么时候别合并实验数据包如果提供了多张表比如销售明细、产品维度、区域维度有一个选择要做在Power Query里把所有表合并成一张大宽表还是保持多张表进模型再建关系。我个人的习惯是——只有两种情况下合并一是维度表字段太少需要在明细表上补充产品名称、区域名称这几个列二是数据本身是单表导入没有建模需求。除此之外都保持多张表进模型建关系理由在下一章详细说星型模型比大宽表更不容易算错也更符合Power BI的设计思路。合并查询的操作路径是“主页→合并查询”选好两张表和关联字段联接类型默认是“左外部”也就是以左边表为主右边表匹配不到的行显示null。注意不要选“仅匹配的行”否则右边表没有对应记录时左边表整行会被丢掉结果里悄悄少数据。追加查询则是把两张结构相同的月度表上下拼在一起用在“一月数据一张表、二月数据一张表”的场景。追加之前先统一列名Power Query的追加查询是按列名匹配的列名不一致会生成两个独立列而不是拼接成一行这是新手最容易忽略的操作前提。3. 数据模型与关系为什么透视表总是算错数把数据清洗完很多人会直接往画布拖字段。但你会发现矩阵里每一个单元格的销售额都一样或者选中某个产品后其他视觉对象纹丝不动。这不是Power BI的玄学而是模型关系没有建对。3.1 星型模型事实表居中维度表围绕它转实验数据包里所有表的正确组织方式都是星型模型。事实表是“销售明细”每一行是一张订单存的是订单号、订单日期、产品编码、区域编码、销售额这些会随业务变化的数据维度表是产品、区域、日期存的是描述属性。事实表和维度表之间用维度表主键与事实表外键建立一对多关系一个维度表不要同时连两张事实表不然Power BI在计算时找不到唯一的筛选路径结果就会出现混乱。查看表关系可以这样左边栏切换到“模型”视图把销售明细、产品、区域、日期四张表拖到合适的位置。关系数量不多就三四个但方向和基数必须核对。项目里常见的关系如下表表角色代表表关键字段作用事实表销售明细订单号、产品ID、区域ID、销售额存放度量值行数多维度表产品产品ID、产品名称、品类提供筛选与切片维度表区域区域ID、省份、城市提供地理维度维度表日期日期、年、月、季度提供时间维度关系和维度表都建好后视觉对象里拖“产品名称”到轴值写“销售额”矩阵才会在每个产品行显示该产品的汇总而不是全表同一个数字。3.2 日期表没有日期表时间智能全失灵实验数据包大概率没有提供独立的日期表只有销售明细里的“订单日期”字段。这种情况下你直接拖订单日期能按年、月下钻但想算同比、环比用SAMEPERIODLASTYEAR就会返回空值。原因是没有一张被标记的日期表。我的做法是新建一张独立的日期表用下面这段DAX日期表 VAR 最小日期 CALCULATE(MIN(销售明细[订单日期]), ALL(销售明细)) -- 取最小订单日期ALL清除筛选 VAR 最大日期 CALCULATE(MAX(销售明细[订单日期]), ALL(销售明细)) -- 取最大订单日期 RETURN -- 用ADDCOLUMNS给每个日期补充年、季度、月份等维度列 ADDCOLUMNS( CALENDAR(最小日期, 最大日期), 年, YEAR([Date]), 季度, QUARTER([Date]), 月份序号, MONTH([Date]), 月份名称, FORMAT([Date], YYYY年MM月) )变量最小日期和最大日期从销售明细里取这里最关键的是ALL(销售明细)——它把外部筛选上下文清掉保证日期表范围覆盖全部订单日期不会因为当前切片器选了某个月就变成只有一个月。CALENDAR返回从最小日期到最大日期的连续日期序列ADDCOLUMNS给每个日期补充年、季度、月份序号和月份名称列。新建完成后在右侧“表工具”里点击“标记为日期表”并把日期列选成日期列。只有完成这一步同比环比这类时间智能计算才有依据。提示如果日期表范围比销售明细短比如销售明细有一笔2023年的订单而日期表从2024年1月开始SAMEPERIODLASTYEAR、DATEADD这些函数会在缺数据的部分返回空排查时先看日期表范围。3.3 关系设置基数、筛选方向与假关系建关系时逐条核对三个点。第一是基数销售明细“产品ID”与产品维度“产品ID”的关系应该是一对多维度表是“一”侧事实表是“多”侧。如果两边都有重复值说明事实表里有脏数据或维度表主键不唯一。第二是交叉筛选方向默认用“单向”从维度表向事实表筛选这个方向保证切片器选产品时销售总额跟着过滤。双向筛选只在明细到明细的跨表计算时才需要普通实验项目不要开否则性能下降且汇总值可能翻倍。第三是假关系用“客户名称”当关联字段时维度表里写“北京分公司”事实表里写“北京分公司 ”带空格关系虽然能建出来但匹配行数很少。遇到这种情况回到Power Query用前面说的Text.Trim清空格刷新模型后再看关系。上下文转换这块也顺便说一下DAX里的行上下文不会自动变成筛选上下文比如在计算列里写“销售额100”它只对本行生效但在度量值里所有计算都在当前筛选上下文中进行。这也是为什么同样一个求和写在计算列和写进度量值结果可能完全不同。实验报告里如果出现同一口径两种结果优先检查是不是把同一个业务指标混用了计算列和度量值。4. DAX度量值从总和到同比让报告从及格变优秀模型建好后最怕的是报告里每个数字都是Power BI自动生成的SUM。这种报告跟Excel透视表相比没有本质进步。DAX度量值才是实验报告拉开差距的地方。4.1 度量值与计算列一个算上下文一个占内存很多人在明细表里手工加一列“利润销售额-成本”的计算列这种做法不是不能用但它有三个问题一是计算列随表存储一万行就存一万个值模型体积变大二是计算列的数值是固定的不与筛选上下文互动三是同一业务口径要复用时要到处复制。度量值不存储结果它是在每个视觉对象请求时按当前筛选上下文动态计算切片器切走一部分数据它自动重算。这就是为什么销售额、订单数、同比要写成度量值而不是计算列。4.2 销售额、订单数、同比、环比四个度量值一次学会在表工具里新建度量值写入下面这段DAX销售额 SUM(销售明细[销售额]) 订单数 COUNTROWS(销售明细) 销售额同比 VAR 本期 [销售额] -- 当前筛选下的销售额 VAR 上期 CALCULATE([销售额], SAMEPERIODLASTYEAR(日期表[日期])) -- 去年同期 RETURN DIVIDE(本期 - 上期, 上期, 0) -- 除数为0时返回0 销售额环比 VAR 本期 [销售额] VAR 上期 CALCULATE([销售额], DATEADD(日期表[日期], -1, MONTH)) -- 往前平移一个月 RETURN DIVIDE(本期 - 上期, 上期, 0)说明一下逻辑SUM是最基础的聚合COUNTROWS统计明细行数这两个是四个度量值的地基同比先算本期再用CALCULATE配合SAMEPERIODLASTYEAR取去年同期期间差值除以基期并用DIVIDE兜底除零环比用DATEADD往前平移一个月就能算出跟上个月的变化率。需要注意SAMEPERIODLASTYEAR和DATEADD都依赖日期表已被标记且日期必须连续否则返回空值VAR在DAX里是变量把计算结果保存下来可以引用多次避免重复计算也方便调试。我建议把这四个度量值一次性建好然后在矩阵里同时拖进去查看每个维度的结果是否合理。如果哪个值异常点度量值名称旁边的按钮Power BI会展示计算明细和依赖关系这是排查DAX最直接的工具比对着公式猜高效得多。4.3 用度量值做KPI卡片可视化要有结论不是只有图实验报告到了最后一步通常要放几个大数字卡片但卡片上的数字没有解释力。我的做法是销售额同比跌了就去看订单数是不是也跌如果订单数没跌问题出在客单价毛利率低了就去看毛利总额是不是同步下降如果毛利额没降说明成本端有问题。这一类对比用已有的销售额、订单数和毛利率三个度量值就能完成图表反而只是辅助。这也是数据可视化最容易被忽略的一点——图是做给人看的但结论是算出来的度量值才是整套报告的灵魂。5. 避坑自查实验数据包里最常见的五个翻车点这一章写的五个坑全部来自我做实验数据报告时真实踩过的现象按“现象→原因→解决”的顺序记录。导入阶段两个建模与DAX阶段三个排查时从上往下过一遍能省下大量改图时间。5.1 导入阶段的两个必查项坑一csv导入后中文全部乱码。现象是表头“客户名称”变成“客户鍚嶇О”之类的一串字符而且这种问题在导入后没法用替换值修复因为列名已经乱掉。原因是实验数据包里的csv是GBK编码Power Query默认按UTF-8解析编码错了中文在导入那一刻就坏了。解决在Power Query编辑器里打开“文件→选项和设置→数据源设置”选中当前csv文件点“编辑”把“区域设置”里的文件原始格式改成GBK然后重新加载如果改完还是乱码用记事本打开csv另存为时选“UTF-8带BOM”再重新导入这个方案在处理老旧实验数据时基本通杀。坑二销售额列里混着“-”符号SUM出来是0或者直接报错。现象是数据看板里销售额卡片显示0但Excel里明明有数。原因是Power Query会根据前200行数据的常见值推断列类型一旦“-”出现频率够高整列就被推断成文本类型SUM自然算不出数字。解决在Power Query编辑器里对销售额列做“替换值”把“-”替换为0或null。替换为0合计时会把这个值算进去替换为null合计时会忽略空值。实验报告里建议替换为0这样总计才不会被空值跳过同比环比的基期也不会出现断层。5.2 建模与DAX阶段的三个必查项坑三矩阵里总计行是明细行总和的两倍。现象是每个月份行数字正常但底部合计差不多是各月之和的两倍甚至更多。原因是事实表和维度表之间设置了双向交叉筛选双向筛选在复合聚合场景下同一个金额可能被重复计数。解决在模型视图里右键关系选“编辑关系”把交叉筛选方向改成“单向”从维度表指向事实表。需要跨表计算时用CALCULATE显式控制上下文不要依赖双向筛选。坑四同比、环比全部返回空值。现象是卡片上什么都不显示矩阵里该列也是一片空白。原因是日期表没有标记或者日期表范围比销售明细的日期范围短时间智能函数找不到完整的时间参照。解决按3.2的DAX生成完整日期范围重点检查CALENDAR的两个边界——如果销售明细里有2023年订单而日期表从2024年1月开始前面的月一定空。做完后右键日期表点“标记为日期表”再拖一个矩阵把年月放行、销售额放值验证每个月份都有数再加时间智能度量值。坑五切片器选了某一个区域图表纹丝不动。现象是切片器选项能正常点击但销售额柱状图不随选择变化。原因是切片器的字段来自区域维度表图表里的销售额来自销售明细而两张表之间没有关系路径或者中间隔着两张表形成了歧义路径。解决把所有视觉对象都落在同一张事实表上取数切片器用维度表字段维度表和事实表建立单向关系最直观的验证方式是在模型视图里把关系线画出来从切片器字段一路看能不能连到事实表。6. 进阶落地用“参数表书签”把实验报告做成交互看板实验报告做到能交差不难但想做出“成品感”重点是交互。我通常会在最后加一个动态指标切换和页面导航这也是企业里做可视化大屏常遇到的需求。做法分三步。第一步建一张参数表把想要切换的指标先列出来参数表 DATATABLE(指标, STRING, {{销售额}, {订单数}, {毛利率}})DATATABLE直接在模型中生成一张内存表列名“指标”下面三行数据不占用外部数据源。第二步写一个动态度量值销售额_动态 VAR 当前指标 SELECTEDVALUE(参数表[指标], 销售额) -- 默认显示销售额 RETURN SWITCH(TRUE(), 当前指标 销售额, [销售额], 当前指标 订单数, [订单数], 当前指标 毛利率, DIVIDE([毛利], [销售额], 0), -- 除零兜底 BLANK() )SELECTEDVALUE的第一参数是切片器当前选中值第二参数是默认值SWITCH(TRUE(), ...)逐个条件判断命中后返回对应度量值没命中返回BLANK。毛利率的计算里DIVIDE第三参数是除零兜底销售额为空时返回0而不是报错。第三步画布上放一个切片器绑定参数表[指标]把图表的值字段全部换成销售额_动态这样切换切片器销售额、订单数、毛利率就在同一套图表之间切换不用复制三份图表。最后用书签做导航在画布上插入按钮格式里“操作→类型→书签→导航”配上提前建好的书签链接就能从总览页跳转到明细页书签能保存当前页面筛选状态这是做演示时最出彩的功能。这份数据包在资源站直接搜标题就能下到建议配合前面的步骤完整走一遍输出一份能直接当作品集展示的报告。我当年第一次做动态切换时把图表都换成了动态度量值结果毛利率在销售额为空时显示空同比卡片也跟着一起空整个页面看起来很“虚”。从那以后我每次做完都强制把参数表里的选项逐个点一遍确认没有任何空值或报错才交出去。希望帮到你。本文还有配套的精品资源点击获取