← 全部项目

AdventureWorks经营分析

销售规模增长是否带来了健康的估算毛利?问题究竟集中在哪个渠道、品类和SKU?

跟着图解看项目怎么完成从数据到结果,逐步查看处理过程
2026 · AdventureWorks

项目介绍

这个项目用 SQL 整理销售数据,再用 Power BI 做出可以筛选和逐步查看明细的经营报表。我想回答的问题是:销售收入主要来自哪里,这些收入带来了多少估算毛利,以及哪些渠道和商品需要进一步检查。项目最后做成了经营总览、盈利诊断和区域分析三页看板,保留了数据处理代码、指标公式和检查记录。 数据来自微软公开的 AdventureWorksDW2022 示例数据库,记录的是一家虚构企业的业务。我下载数据库备份,在本地 SQL Server 中还原,再读取网络直销和经销商的销售记录,以及产品、日期、地区和促销资料。

12.1万统一销售明细
$1.10亿样例销售收入
11.43%估算毛利率
73.26%Reseller收入占比
SQL ServerSQLPower QueryPower BIDAXPython分析工作台

项目阶段

这个项目先把两个销售渠道放在一起比较,再逐步查看收入与估算毛利的差异。沿着六个阶段,可以看到数据怎样变成三页经营看板。

1把两个渠道的销售记录合在一起

官方数据库备份 → 在本地 SQL Server 中还原

网络直销Internet 销售表
经销商Reseller 销售表
统一字段与编号保留渠道信息
合并全部商品行
121,253 条明细一行=一张订单
中的一行商品
合并保留原来的商品记录;按订单汇总的数据在后续单独生成。

SQL 统一直销与经销商的字段后,按行追加两张销售表,保留渠道信息,得到 121,253 条商品明细。订单编号加入渠道前缀,明细编号再加商品行号,便于区分每条记录。

工具与方法:SQL Server 是存放和查询数据的软件;SQL 是查询语言;Python 脚本负责导出后续要用的表格。

查看处理方法与依据收起处理方法与依据
  1. 下载微软 AdventureWorksDW2022 备份,在 SQL Server 中还原
  2. 两张销售表统一字段,并分别保留渠道名称
  3. 使用 UNION ALL 追加全部商品行
  4. 生成订单编号与明细编号 → 得到 121,253 条销售明细
需要区分什么处理规则为什么这样处理
两个销售渠道Internet 与 Reseller 统一列名、含义和顺序,再纵向追加两个渠道都是销售记录,可以放在同一张表中比较
一张订单渠道+原订单号构成 order_id避免不同渠道的订单编号重合
一个商品行渠道+原订单号+行号构成 sales_line_id同一订单可以购买多种商品,需要分别保存
重复与保留UNION ALL 保留所有行,重复编号另外检查相同金额或商品的两行可能是两笔真实销售

合并渠道时使用按行追加;关联产品、日期等资料时才按编号连接。前一步增加销售记录,后一步让销售记录能够按产品和时间筛选。

2检查合并后的数据有没有缺失或重复

检查对象怎样判断
行数与金额两张源表相加 = 统一销售表
明细编号每个编号出现次数 = 1
关键字段与关联必要信息不缺失,编号能找到对应表
日期范围记下各渠道覆盖到哪一天
这些是检查规则。SQL 保存具体计数,Power Query 用于查看整表质量与字段类型。

SQL 对照合并前后的行数、收入和成本,检查重复编号、缺失字段及无法关联的记录。Power Query 用于查看字段类型、空值和错误,日期覆盖不完整的情况单独记录。

工具与方法:SQL 独立执行检查;Power Query 是 Power BI 内整理与检查数据的功能,用来查看类型、空值和错误。

查看处理方法与依据收起处理方法与依据
  1. 分别统计两张源表的行数、收入与成本
  2. 对照合并后的销售明细
  3. 检查编号、缺失值与资料表关联
  4. 在 Power Query 查看类型和错误,并记录日期覆盖范围
检查对象具体做法要发现的问题
行数与金额源表合计与统一视图比较合并时丢行、重复行或字段取错
明细编号按 sales_line_id 分组,查找计数大于 1 的编号一条商品明细被重复保存
关键字段与关联统计空值;查找在资料表中没有对应编号的记录日期、产品等信息缺失或无法筛选
类型与时间范围Power Query 查看整份数据的列质量和日期范围类型转换错误、年份或渠道覆盖不完整

Power Query 是 Power BI 中读取和整理数据的工具。检查范围需要切换到整个数据集,避免只看到预览行的情况。

年份比较要先确认覆盖月份。样例中存在不完整年份,经销商的 2013 年记录只覆盖到 11 月,不能直接把这段数据当成完整年度。

3连接表格,让筛选条件找到对应销售

日期表哪年、哪月、哪天
产品表品类、具体产品
销售明细表收入 · 成本 · 数量
地区表国家、销售区域
促销表促销活动与类型
例如选择“2013 年”和“自行车”,Power BI 就筛出同时满足条件的销售明细,再计算对应指标。

日期、产品、地区和促销表通过编号关联销售明细。选择年份或品类后,Power BI 筛出对应记录,再计算图表中的数字;资料表到销售表采用单向一对多关系。

工具与方法:Power BI Desktop 是报表软件;星型模型指销售表在中心、分类说明表分别与它连接的表格结构。

查看处理方法与依据收起处理方法与依据
  1. 将销售明细放在模型中心
  2. 四张资料表按编号连接销售明细
  3. 用户选择年份、产品、地区或促销
  4. 筛选传到销售明细 → 图表重新计算
资料表销售明细中的关联字段资料表中的对应字段
日期表OrderDateKeyDateKey
产品表ProductKeyProductKey
地区表SalesTerritoryKeySalesTerritoryKey
促销表PromotionKeyPromotionKey

资料表每个编号对应一条资料,销售明细中同一编号可以出现多次,所以采用资料表到销售明细的单向一对多关系。这种中心放销售、周围放资料的结构称为星型模型。

例如选择某个年份,日期表先确定这一年的日期编号,再筛出对应商品行。总览、盈利诊断和区域页面由此使用相同的筛选条件。

4按统一公式计算六项指标

销售收入100
−
样例产品成本60
=
估算毛利40
估算毛利40
÷
销售收入100
=
估算毛利率40%
订单数:统计不重复的订单编号。
销售件数:把每行购买数量相加。
100、60 和 40 为假设金额,使用相同单位,仅用于说明公式。页面实际金额来自样例销售数据。

DAX 按当前筛选范围计算收入、成本、估算毛利、毛利率、订单数和销售件数。毛利率用总估算毛利除以总收入,订单数按不同订单编号计数。样例成本不包含企业全部费用。

工具与方法:DAX 是 Power BI 中编写指标公式的语言;SQL 用另一份查询计算对照结果。

查看处理方法与依据收起处理方法与依据
  1. 用户选定年份、渠道或品类
  2. DAX 读取当前范围内的销售明细
  3. 计算六项指标 → 同步显示在卡片和图表中
指标计算方法计算时注意什么
销售收入对统一视图中的 revenue 求和;来源为 SalesAmount使用当前筛选范围
样例产品成本对 cost 求和;来源为 TotalProductCost该字段已经是对应商品行的成本,不再乘数量
估算毛利销售收入 − 样例产品成本样例产品成本不包含企业全部费用
估算毛利率总估算毛利 ÷ 总销售收入不直接平均每行的毛利率;分母为零时单独处理
订单数对带渠道前缀的 order_id 去重计数一张订单的多个商品行只计一次
销售件数对 quantity 求和;来源为 OrderQuantity商品件数与订单数分别计算

DAX 是 Power BI 的指标计算语言。公式会随筛选条件重新计算,因此各页面可以共用相同定义。举例说明:若所选记录收入合计 100、成本合计 60,估算毛利就是 40,估算毛利率就是 40%;这里的金额为说明公式而设。

5从总体结果逐步找到问题集中的位置

经销商收入占比73.26%
经销商估算毛利占比3.75%
  1. 经营总览
  2. 经销商渠道
  3. 年份与品类
  4. 具体产品
两条横条均按 0—100% 绘制,分别以总收入和总估算毛利为分母。项目据此继续调查经销商的产品、折扣与地区构成。

经销商贡献约 73.26% 的收入,估算毛利贡献却只有约 3.75%。继续按年份、品类和商品查看,可以定位值得核查的销售记录;折扣与低毛利同时出现,仍不足以证明因果。

工具与方法:Power BI 图表与筛选器展示比较;SQL 按不同条件分组汇总,提供分析依据。

查看处理方法与依据收起处理方法与依据
  1. 总览比较收入与估算毛利贡献
  2. 经销商:收入占 73.26%,估算毛利贡献约 3.75%
  3. 继续按年份 → 品类 → 具体商品查看
  4. 结合折扣和地区,确定值得继续核查的记录
查看顺序观察到的结果接下来查什么
渠道经销商的收入贡献明显高于估算毛利贡献差异集中在哪一年、哪类商品
年份与品类2013 年经销商估算毛利约 −49.19 万美元;自行车约 −101.66 万美元哪些商品为负,其他品类抵消了多少亏损
地区与渠道加拿大整体毛利率约 6.16%;直销约 41.96%,经销商约 1.24%地区结果是否受到渠道结构影响
折扣与商品对照折扣档位和负毛利商品继续核查价格、成本与促销条件

下钻就是从总体逐步查看更细的分组。这里先用渠道差异确定查看方向,再进入年份、品类和商品,避免直接在全部明细里寻找原因。

这些结果说明问题集中在哪里。折扣与低毛利同时出现,还需要价格和成本等资料才能判断原因;年度数字也按实际覆盖月份解释。

6对照计算结果,再保存可查依据的报告

销售明细用于 Power BI

121,253 条商品明细

SQL 计算 ↔ Power BI 指标

按同一日期、渠道与公式对照
订单汇总用于工作台

31,455 张订单

质量检查 → 计算结果 → 审查 → 报告

保存检查记录与发布批准
两条路径的记录单位不同。工作台审查订单数据与结论,Power BI 表关系、具体商品分析和页面筛选分别核对。

Power BI 使用商品明细展示结果,工作台另读取汇总后的 31,455 张订单,检查数据并保存计算依据。工作台报告通过检查,不代表整份 Power BI 文件已经完成独立审查。

工具与方法:SQL 和 Power BI 分别计算;工作台保存任务、运行结果和人工发布批准。

查看处理方法与依据收起处理方法与依据
  1. 121,253 条商品明细 → Power BI 三页报表
  2. 另按渠道+订单号汇总 → 31,455 张订单
  3. 订单表与分析输入合同交给工作台
  4. 核对检查记录、计算结果与报告
材料一行表示什么使用目的
Power BI 销售明细一张订单的一个商品行查看产品、品类、促销和经营差异
工作台订单表一张订单检验订单级数据的检查、计算和报告流程
SQL 对照结果同一范围的行数、收入与成本与页面使用相同筛选条件,核对数字

选择订单表,是因为工作台本次经营案例以订单为记录单位。31,455 来源于销售明细按渠道和订单号汇总,并非另找的一批订单。

工作台复核的是提交的订单数据及对应计算结果。Power BI 的商品关系、DAX 和页面筛选,还要用相同范围的 SQL 结果对照。

订单表先对每个订单的各品类收入求和,再取收入最高的品类作为该订单的品类;收入相同时按品类名称升序选取。因此订单表的品类表示主要收入品类,按商品品类查看时仍使用销售明细。

返回项目阶段目录 ↑

图片与材料

分析结果

  1. 01

    Reseller贡献约73.26%的收入,却只贡献约3.75%的估算毛利,规模与盈利贡献明显错位。

  2. 02

    2013年Reseller渠道估算毛利为负,亏损主要集中在Bikes品类与部分SKU。

  3. 03

    区域差异很大程度上由渠道与产品结构共同影响,不能直接把相关关系说成地区导致亏损。

分析中的判断与处理

折扣与低毛利同时出现,只能说明两者存在关联,现有数据还不能证明折扣造成亏损;地区毛利率不同,也需要继续检查渠道和产品结构。项目将已经确认的事实、待验证原因和当前无法证明的部分分开,使三页Power BI分别承担经营总览、盈利诊断和区域分析的任务。

我与 AI 如何完成项目

Codex + ChatGPT-sol

个人完成。本人定义经营问题与指标口径,搭建分析路径,校验SQL与Power BI结果,并对结论和边界负责。

我先怎样确定分析问题

我把课程数据、已有字段和“规模增长是否带来健康估算毛利”的问题交给Codex与ChatGPT-sol讨论。AI帮助检查还缺少哪些指标、维度和对账步骤,我根据经营含义确定销售收入、样例产品成本、估算毛利、估算毛利率、订单数和销售件数的口径。

AI怎样帮助搭建技术方案

AI提供SQL统一视图、星型模型、DAX度量值和页面结构的建议,也在Power BI出现关系、排序、条件格式和DAX错误时帮助定位原因。我在Power BI中完成导入、关系建立、度量值创建、筛选器设置和页面制作。

哪些结果由我核对

我使用Power Query检查整表质量,比较SQL与Power BI总额,逐页检查筛选器和指标是否联动,再根据渠道、品类、SKU和地区结果修正分析结论。

工作台在项目末尾怎样参与

Power BI页面完成后,我再把分析就绪数据交给可信分析工作台生成可追溯报告。工作台负责保存口径、检查与结论来源,Power BI继续承担交互分析和展示。

参考与使用说明

Microsoft AdventureWorks 示例数据 ↗

AdventureWorks提供虚构企业的销售、产品、客户和地区数据。本项目自行统一Internet与Reseller销售口径,并设计经营总览、盈利诊断和区域分析页面。

结果适用范围
  • AdventureWorks是虚构样例,结论用于展示分析能力,不代表真实企业经营事实。
  • 估算毛利=销售收入−样例产品成本,不是包含期间费用、税费后的净利润。
  • 2010、2014及Reseller 2013存在不完整期间,跨年比较必须谨慎。

查看项目动画图解 ↗

下一个项目可信 AI 数据分析工作台
项目截图打开原文件 ↗
100%滚轮缩放 · 拖动查看