Power BI财销一体分析——TOPN分析实践
欢迎来到Powerbi小课堂,前几期课程我们深入学习了各种财务、销售实用案例,本期我将带领大家整合分散知识点,逐步构建一个全面的分析模型,涵盖封面、登录页、导航页、CEO驾驶舱等模块,以及趋势、产品、畅销品等多维度分析,同时融入度量值嵌套、计算组、动态指标、TOPN分析等高阶技巧。今天我将为大家带来TOPN分析应用实践,通过书签导航在一个页面内切换多个视觉对象,接下来,让我们直接进入今天的实用技巧分享环节。如果您在实践过程中遇到任何问题,欢迎留言交流。请关注我们的公众号《BI研究所》,以获取更多案例更新和学习资源。

想要一份这样的可视化看板吗?想学吗?我教你呀!
案例背景:
我司为专业运动自行车跨国销售企业,涵盖自行车、组件、配件及运动服装。现需制作财销一体分析,紧密结合财务与销售,通过技术手段实现深度融合,数据共享与流程优化,提升决策与运营效率,优化资源配置,增强风险控制,推动企业可持续发展。
设计思路:
通过本、量、利、销维度准确把控财务状况,从品、客、地域三个维度全面分析企业运营趋势,
- 准备基础数据
- 数据清洗
- 建立关系视图
- 个性美化设计
- 数据建模(度量值)
- 制作可视化报告
★数据建模:TOPN分析
首先我们要理解TOPN分析是什么,TOPN分析是一种聚焦于识别数据集中排名前列的关键项的数据分析方法,通常用于快速定位影响业务的核心因素。以下为简要介绍:
核心概念
定义:根据特定指标对数据进行排序,选取排名前N位(如TOP5、TOP10)的项进行深入分析,N值可根据需求灵活调整。
目的:从海量数据中提炼关键信息,辅助决策者优化资源分配、制定策略。
典型应用场景
业务分析
销售管理:识别畅销商品(如前10名贡献60%营收),指导库存与促销。
客户价值:筛选高消费/高活跃用户(TOP20%客户贡献80%利润)。
运营优化
流量分析:定位访问量最高的页面或渠道,优化用户体验。
问题排查:找出故障率最高的设备或环节,优先修复。
市场策略
广告效果:分析点击/转化率最高的渠道,调整预算分配。
实施步骤
- 明确目标:确定分析方向(如提升销售额、降低流失率)。
- 选择指标:选取关键指标(如销售额、访问量、故障次数)。
- 数据准备:清洗并整理相关数据集。
- 排序与筛选环节:依据所选指标进行降序排列,并精准截取前N项关键数据,以便后续深入分析。
- 结果解读:结合业务背景分析头部项目的贡献或问题根源。
- 可视化呈现:使用柱状图、饼图等直观展示TOPN项。
在建模之前,我们首先要确定分析的指标,这里我们定为业绩(销售额)、销量、利润,同时我们确定此次分析N的范围,之前我们建立了用于给排名函数固定筛选条件的表,这次我们要建立一个阈值,将排名范围扩大到50名,新建参数功能,选择数值范围,命名为排名分段,最小值10,最大值50,增量10,勾选将切片器添加到此页,做完这一步,我们正式进入高阶度量值建立。
公式:
产品利润topN =
VAR SelectedRank = SELECTEDVALUE('排名辅助'[排序])
VAR RankedProducts =
ADDCOLUMNS(
ALL('产品表'[产品]),
"ProductProfit", [利润],
"Ranking", RANKX(ALL('产品表'[产品]), [利润],, DESC)
)
RETURN
MAXX(
FILTER(RankedProducts, [Ranking] = SelectedRank),
'产品表'[产品]
)
产品销量topN =
VAR SelectedRank = SELECTEDVALUE('排名辅助'[排序])
VAR RankedProducts =
ADDCOLUMNS(
ALL('产品表'[产品]),
"ProductProfit", [销量],
"Ranking", RANKX(ALL('产品表'[产品]), [销量],, DESC)
)
RETURN
MAXX(
FILTER(RankedProducts, [Ranking] = SelectedRank),
'产品表'[产品]
)
产品销售额topN =
VAR SelectedRank = SELECTEDVALUE('排名辅助'[排序])
VAR RankedProducts =
ADDCOLUMNS(
ALL('产品表'[产品]),
"ProductProfit", [总销售额],
"Ranking", RANKX(ALL('产品表'[产品]), [总销售额],, DESC)
)
RETURN
MAXX(
FILTER(RankedProducts, [Ranking] = SelectedRank),
'产品表'[产品]
)
公式逻辑解析:以产品销售额topN为例
变量1:SELECTEDVALUE('排名辅助'[排序])
作用:从参数表 排名辅助 中获取用户选择的排名值(如N=3表示Top3)。
依赖:需提前创建参数表 排名辅助,通常包含一列连续整数(如1,2,3,...)并通过切片器绑定。
变量2:ADDCOLUMNS()
作用:为原始表添加新列。此处为所有产品添加两列:
ProductProfit:计算每个产品的总销售额(依赖度量值 [总销售额])。
Ranking:使用 RANKX 对所有产品按销售额降序(DESC)排名。
RANKX()
逻辑:对 ALL('产品表'[产品]) 的所有产品,根据 [总销售额] 降序排名。
返回结果
FILTER(RankedProducts, [Ranking] = SelectedRank)
作用:从已计算排名的表 RankedProducts 中筛选出指定排名的行。
MAXX()
作用:从筛选后的表中提取 产品表[产品] 列的值。
公式:
销量占比 = var a =CALCULATE([销量],ALLSELECTED('产品表'[产品]))
return IF(ISFILTERED('产品表'[产品]),divide([销量],a),BLANK())
销售金额占比 = var a =CALCULATE([总销售额],ALLSELECTED('产品表'[产品]))
return IF(ISFILTERED('产品表'[产品]),divide([总销售额],a),BLANK())
利润占比 = var a =CALCULATE([利润],ALLSELECTED('产品表'[产品]))
return IF(ISFILTERED('产品表'[产品]),divide([利润],a),BLANK())
公式逻辑解析:以销量占比为例
变量1:CALCULATE([销量], ALLSELECTED('产品表'[产品]))
作用:计算在当前报表页面所有可见产品(受外部筛选器影响,但忽略对产品列的直接筛选)的总销量。
关键点:ALLSELECTED 会保留来自其他列(如时间、地区)的筛选,仅移除对 '产品表'[产品] 的筛选。
返回结果:
ISFILTERED('产品表'[产品])
作用:检查是否对 '产品表'[产品] 列应用了直接筛选(例如切片器选择、表格中点击某产品)。
返回值:TRUE(已筛选)或 FALSE(未筛选)。
DIVIDE([销量], a)
作用:安全除法,计算当前产品的销量占所有可见产品总销量的比例(等价于 [销量]/a,但自动处理除零错误)。
BLANK()
逻辑:当未筛选产品时返回空值,避免无意义的全局占比显示
公式:
2017销量占比 = var a =CALCULATE([销量],ALLSELECTED('产品表'[产品]),'日期表'[年]=2017)
VAR B = CALCULATE([销量],'日期表'[年]=2017)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2017利润占比 = var a =CALCULATE([利润],ALLSELECTED('产品表'[产品]),'日期表'[年]=2017)
VAR B = CALCULATE([利润],'日期表'[年]=2017)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2017业绩占比 = var a =CALCULATE([总销售额],ALLSELECTED('产品表'[产品]),'日期表'[年]=2017)
VAR B = CALCULATE([总销售额],'日期表'[年]=2017)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2018销量占比 = var a =CALCULATE([销量],ALLSELECTED('产品表'[产品]),'日期表'[年]=2018)
VAR B = CALCULATE([销量],'日期表'[年]=2018)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2018利润占比 = var a =CALCULATE([利润],ALLSELECTED('产品表'[产品]),'日期表'[年]=2018)
VAR B = CALCULATE([利润],'日期表'[年]=2018)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2018业绩占比 = var a =CALCULATE([总销售额],ALLSELECTED('产品表'[产品]),'日期表'[年]=2018)
VAR B = CALCULATE([总销售额],'日期表'[年]=2018)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2019销量占比 = var a =CALCULATE([销量],ALLSELECTED('产品表'[产品]),'日期表'[年]=2019)
VAR B = CALCULATE([销量],'日期表'[年]=2019)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2019利润占比 = var a =CALCULATE([利润],ALLSELECTED('产品表'[产品]),'日期表'[年]=2019)
VAR B = CALCULATE([利润],'日期表'[年]=2019)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2019业绩占比 = var a =CALCULATE([总销售额],ALLSELECTED('产品表'[产品]),'日期表'[年]=2019)
VAR B = CALCULATE([总销售额],'日期表'[年]=2019)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2020销量占比 = var a =CALCULATE([销量],ALLSELECTED('产品表'[产品]),'日期表'[年]=2020)
VAR B = CALCULATE([销量],'日期表'[年]=2020)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2020利润占比 = var a =CALCULATE([利润],ALLSELECTED('产品表'[产品]),'日期表'[年]=2020)
VAR B = CALCULATE([利润],'日期表'[年]=2020)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
2020业绩占比 = var a =CALCULATE([总销售额],ALLSELECTED('产品表'[产品]),'日期表'[年]=2020)
VAR B = CALCULATE([总销售额],'日期表'[年]=2020)
return IF(ISFILTERED('产品表'[产品]),DIVIDE(B,a),BLANK())
公式逻辑解析:以2017年销量占比为例
以上公式逻辑相同,目的是对之前建立的指标占比公式进行分解,
变量1:CALCULATE([销量], ALLSELECTED('产品表'[产品]), '日期表'[年]=2017)作用:计算2017年所有可见产品的总销量(a)。
关键点:
ALLSELECTED('产品表'[产品]) 保留其他列的筛选(如地区、类别),仅移除对产品列的直接筛选。'日期表'[年]=2017 限定仅计算2017年的数据。
若未对产品列筛选,a = 2017年全局总销量;若筛选了其他列(如地区),a = 该地区2017年所有产品销量。
变量2:CALCULATE([销量], '日期表'[年]=2017)
作用:计算2017年当前上下文产品的销量(B)。
差异:
若已筛选某产品(如切片器选择“产品A”),B = 产品A在2017年的销量。
若未筛选产品,B = 2017年所有产品的总销量(此时 B = a,占比为100%)。
返回结果:
ISFILTERED('产品表'[产品])
逻辑:仅当用户主动筛选产品(如点击表格中的某行、使用产品切片器)时,才计算占比,否则返回空值。
DIVIDE(B, a)
结果:返回 2017年当前产品销量 / 2017年所有可见产品销量,自动处理除零错误。
公式:
利润排名 = SWITCH(TRUE(),
ISFILTERED('产品表'[子类别]), RANKX(ALLSELECTED('产品表'[子类别]),[利润]),
ISFILTERED('产品表'[模型]),RANKX(ALLSELECTED('产品表'[模型]),[利润]),
ISFILTERED('产品表'[产品]), RANKX(ALLSELECTED('产品表'[产品]),[利润]),
ISFILTERED('产品表'[库存ID]), RANKX(ALLSELECTED('产品表'[库存ID]),[利润]),
BLANK())
销量排名 = SWITCH(TRUE(),
ISFILTERED('产品表'[子类别]), RANKX(ALLSELECTED('产品表'[子类别]),[销量]),
ISFILTERED('产品表'[模型]),RANKX(ALLSELECTED('产品表'[模型]),[销量]),
ISFILTERED('产品表'[产品]), RANKX(ALLSELECTED('产品表'[产品]),[销量]),
ISFILTERED('产品表'[库存ID]), RANKX(ALLSELECTED('产品表'[库存ID]),[销量]),
BLANK())
销售额排名 = SWITCH(TRUE(),
ISFILTERED('产品表'[子类别]), RANKX(ALLSELECTED('产品表'[子类别]),[总销售额]),
ISFILTERED('产品表'[模型]),RANKX(ALLSELECTED('产品表'[模型]),[总销售额]),
ISFILTERED('产品表'[产品]), RANKX(ALLSELECTED('产品表'[产品]),[总销售额]),
ISFILTERED('产品表'[库存ID]), RANKX(ALLSELECTED('产品表'[库存ID]),[总销售额]),
BLANK())
公式逻辑解析:以利润排名为例
这些公式用作辅助排名工具,鉴于之前已将排名范围扩展至50名,因此需利用公式固定排名范围,确保在通过切片器筛选排名范围时,能够动态更新相应的可视化表单。
SWITCH(TRUE(), ...)
作用:按顺序检查多个条件,返回第一个匹配的结果(类似 if-else if 链)。
执行流程:
检查是否筛选了 子类别 → 是则计算子类别利润排名。
否则检查是否筛选了 模型 → 是则计算模型利润排名。
以此类推,最后均不满足时返回 BLANK()。
ISFILTERED()
功能:检测指定列是否被直接筛选(如通过切片器、交叉筛选或表格点击)。
优先级:公式按 子类别 → 模型 → 产品 → 库存ID 的顺序检查,因此更粗粒度的筛选(如子类别)会优先触发。
RANKX(ALLSELECTED(...), [利润])
作用:对当前可见的某一层级(如所有子类别)按利润值降序排名。
关键点:
ALLSELECTED 保留其他列的筛选上下文(如时间、地区),仅解除对目标列(如子类别)的筛选。
默认降序排名(高利润排名靠前),如需升序可添加 , , ASC 参数。
BLANK()
触发条件:当没有任何列被筛选时返回空值,避免无意义的全局排名。
无筛选时的行为
若用户未筛选任何列(如查看全局数据),则显示空白,避免计算全表排名(可能性能开销大或无意义)。
公式:
利润排名分段辅助 = var t = SELECTEDVALUE('排名分段'[排名分段])
return SWITCH(true(),
AND(t=10,[利润排名]<=10),[利润],
AND(t=20,[利润排名]<=20&&[利润排名]>10),[利润],
AND(t=30,[利润排名]<=30&&[利润排名]>20),[利润],
AND(t=40,[利润排名]<=40&&[利润排名]>30),[利润],
AND(t=50,[利润排名]<=50&&[利润排名]>40),[利润],
blank())
销量排名分段辅助 = var t = SELECTEDVALUE('排名分段'[排名分段])
return SWITCH(true(),
AND(t=10,[销量排名]<=10),[销量],
AND(t=20,[销量排名]<=20&&[销量排名]>10),[销量],
AND(t=30,[销量排名]<=30&&[销量排名]>20),[销量],
AND(t=40,[销量排名]<=40&&[销量排名]>30),[销量],
AND(t=50,[销量排名]<=50&&[销量排名]>40),[销量],
blank())
销售额排名分段辅助 = var t = SELECTEDVALUE('排名分段'[排名分段])
return SWITCH(true(),
AND(t=10,[销售额排名]<=10),[总销售额],
AND(t=20,[销售额排名]<=20&&[销售额排名]>10),[总销售额],
AND(t=30,[销售额排名]<=30&&[销售额排名]>20),[总销售额],
AND(t=40,[销售额排名]<=40&&[销售额排名]>30),[总销售额],
AND(t=50,[销售额排名]<=50&&[销售额排名]>40),[总销售额],
blank())
公式逻辑解析:以利润排名分段辅助为例
此度量值用于给可视化固定筛选使用
变量1:SELECTEDVALUE('排名分段'[排名分段])
作用:从参数表 排名分段 中获取用户选择的分段值(如10、20、30等)。
依赖:需要提前创建包含 排名分段 列的参数表,并通过切片器或下拉菜单绑定该列。
返回结果
SWITCH(TRUE(), ...)
功能:按顺序检查多个条件,返回第一个匹配的结果。
条件结构:每个条件均为 AND(t=分段值, 排名区间),确保同时满足用户选择的分段和排名范围。
排名区间逻辑
前10名:[利润排名]<=10
11-20名:[利润排名]<=20 && [利润排名]>10
以此类推,每10名为一个区间。
注意:区间是左闭右开的(如11-20名实际包含第11名到第20名)。
如果当前产品的利润排名落在用户选择的区间内,则返回该产品的 [利润] 值,否则返回 BLANK()。
★制作可视化报告
第一步:设置报表页格式选项,选择画布背景,上传我们设计好的素材
第二步:插入一个矩形图,填充颜色,打开阴影、发光功能
第三步:添加主页图标图像,启用交互功能,设置类型为书签,并指定书签为主页,点击该图标即可快速跳转至主页。
第四步:插入图像导航图标。
第五步:插入四个切片器及文本框,将分类、日期、渠道、国家等字段分别拖放至对应切片器,隐藏切片器标题,在文本框中手动输入切片器标题。随后,在可视化页面顶部横向排列这些元素。接着,打开视图窗口的选择功能,选中所有切片器和文本框,通过右键菜单进行分组,命名为‘筛选组’。
第六步:引入第三方视觉组件Tile Search Slicer by TME AG,并将产品表建议标价字段拖入该组件中。
第七步:引入第三方视觉组件Attribute Slicer,并插入两个,并将产品表子类别、模型字段拖入该组件中,这三个切片器的使用是为了实现多选,并呈现多选项目。
第八步:插入三个形状,选择圆角矩形,分别添加对比强烈的颜色,并插入三个文本框,利润top3,销量top3,业绩top3,将文本框调整大小置于圆角矩形内,用于呈现不同指标前三名的产品名称。
第九步:选取素材包内的数字图标作为图像,调整图标框大小并嵌入圆角矩形框中,以便辅助展示各类指标排名前三的产品排名情况。
第十步:创建九个卡片图,分别导入度量值产品利润topN、产品销量topN、产品销售额topN,并将排名辅助表中的排名字段设置为筛选条件,应用于可视化对象,确保每个卡片图展示的是对应指标排名前1、2、3的产品。
第十一步:调整九个卡片图的大小,并关闭其标题显示,然后将它们精准放置于对应的圆角矩形框内。接着,利用选择分组功能,将已创建的卡片图、文本框、图标以及圆角矩形整合为一组,并命名为‘卡片组’。
第十二步:创建三个矩阵图,将‘产品’字段拖入行区域。第一个矩阵图的值区域分别添加度量值:利润、利润占比及2017至2020年各年的利润占比;第二个矩阵图的值区域添加度量值:销量、销量占比及2017至2020年各年的销量占比;第三个矩阵图的值区域添加度量值:总销售额、总销售额占比及2017至2020年各年的总销售额占比。随后,将利润排名分段辅助、销量排名分段辅助、销售额排名分段辅助分别作为筛选器添加到对应的矩阵图中,设置筛选条件为显示值非空,并应用这些筛选器。
第十三步:再次创建三个矩阵图,将‘国家’和‘年度名称’字段拖入行区域,将排名辅助表的‘排名字段’拖入列区域。第一个矩阵图的值区域添加度量值‘产品利润topn’;第二个矩阵图的值区域添加度量值‘产品销量topn’;第三个矩阵图的值区域添加度量值‘产品销售额topn’。
第十四步:插入两个空白书签按钮,分别命名为畅销产品业绩矩阵和topn矩阵,并给控件替换图标,分别为素材包畅销作品图标和产品详情图标,再插入两个空白的书签导航器备用。
第十五步:首先,将已创建的矩阵图、切片器、书签导航及书签按钮等元素,根据其功能特性,划分为两个主要分组,即topn矩阵组和指标矩阵组。
第十六步:打开视图窗口书签功能,给可视化对象添加书签,以topn矩阵为例,点开对应分组,选择我们要添加书签的可视化对象,点击另外两个可视化对象后面的眼睛实现隐藏功能,点击添加书签,重命名为对应的矩阵名称,并重复以上动作,为不同的可视化对象添加书签,右键书签点击更新,最后测试下选择不同书签是否能出现对应可视化对象,而其他两个可视化对象实现隐藏,注意在执行此步骤时,一定要正确使用可视化对象的隐藏和显示,这个步骤类似于录制我们对此可视化页面的操作步骤,一步录错前功尽弃,按照不同可视化对象功能,多选书签,点击右键分组,重命名为topn导航和指标矩阵导航。
第十七步:点击先前创建的备用书签导航,在视觉对象中选择书签功能,并将相应的书签分组分配给空白的书签导航。这样,当我们点击控件时,系统会根据预设的书签显示对应的可视化对象。最后,将书签导航器拖动至相应的可视化分组位置。
第十八步:在视图窗口中激活书签功能,并为畅销品页面创建一个名为‘畅销品’的新书签。接着,将该书签拖放至页面导航组中。
第十九步:插入一个书签导航器,视觉对象选择书签功能,将对应的书签分组页面导航组赋给空白的书签导航。
第二十步:如图美化页面,开启编辑交互功能,关闭排名分段切片器对于其他视觉对象的干扰。

好的,今天的讲解就到这里。后期课程也会逐渐增加难度,如果在学习过程中需要帮助,欢迎随时联系作者,精彩内容,敬请期待。
获取模板文件或咨询,联系瓶子微信wdfyqx |