Power BI 中的计算组:可重用 DAX 模式
考虑一个包含 40 项指标的财务模型:收入、毛利润、EBITDA、净利润等 36 项。现在,企业希望每个衡量指标都可用于当前期间、前期、同期变化、年初至今、之前的年初至今和年初至今的变化。这是 240 项措施。然后他们想要货币转换——三种货币。这就是 720 项措施。
如果没有计算组,这将是一场维护噩梦。对于计算组,时间智能逻辑编写一次,货币转换逻辑编写一次,并且它们自动应用于每个基本度量。 40 项措施仍保留为 40 项措施 — 其余的由计算项完成。
本指南涵盖了从概念基础到实际实现的计算组,包括优先规则、SELECTEDMEASURE() 技术以及在同一模型中组合多个计算组等高级模式。
要点
- 计算组用几个计算项取代了数百个冗余的时间智能和比较措施
- SELECTEDMEASURE() 引用当前评估上下文中的任何度量 - 可重用性的关键
- 优先级控制多个组同时应用时哪个计算组优先
- 计算项中的 FORMAT() 字符串启用测量感知数字格式
- 计算组需要表格编辑器来创建(Power BI Desktop UI 本身不可用)
- 多个计算组可以交互——时间智能组+货币组+场景组协同工作
- 计算组可用于实现假设场景、单位切换和显示货币选择
- 可以使用 ISSELECTEDMEASURE() 从特定计算组中排除度量
计算组解决的问题
在计算组之前,Power BI 中的时间智能意味着为基本指标和时间计算的每个组合创建单独的度量:
Revenue = SUM(Sales[Amount])
Revenue PY = CALCULATE([Revenue], SAMEPERIODLASTYEAR('Date'[Date]))
Revenue YTD = CALCULATE([Revenue], DATESYTD('Date'[Date]))
Revenue YTD PY = CALCULATE([Revenue], DATESYTD(SAMEPERIODLASTYEAR('Date'[Date])))
Revenue vs PY = [Revenue] - [Revenue PY]
Revenue vs PY % = DIVIDE([Revenue vs PY], [Revenue PY])
这是收入的 6 项衡量指标。对毛利润、EBITDA、营业费用和另外 7 个 KPI 重复上述操作 — 突然间您就有了 66 个指标,所有指标的公式几乎相同。当企业要求更改时间智能逻辑(例如,使用会计年度而不是日历年度)时,每个度量都需要更新。
计算组通过将“我们正在测量什么”(基本测量)与“我们如何比较它”(计算项目)分开来解决这个问题。一个包含 6 个项目的计算组替换了模型中每个基本度量的 5 个附加度量。
核心概念
计算组:语义模型中的一个特殊表,只有一列。该列包含“计算项目” - 每个项目都会修改在切片器中选择或在矩阵/图表中使用时计算基本度量的方式。
计算项:使用 SELECTEDMEASURE() 引用当前正在评估的度量的命名 DAX 表达式。每个计算项在切片器中显示为一行,控制显示的时间段或比较模式。
SELECTEDMEASURE():一个 DAX 函数,返回计算组上下文中当前正在评估的任何度量的值。这就是计算组可重复使用的原因 - 相同的项目公式适用于模型中的每个度量。
优先级:当多个计算组同时处于活动状态时(例如,用户从时间智能切片器中选择“上一年”,并从货币切片器中选择“美元”),优先级决定首先应用哪个组的计算项。
使用表格编辑器创建计算组
Power BI Desktop 没有用于创建计算组的本机 UI(截至 2026 年初)。它们必须使用外部工具创建 - Tabular Editor 2(免费)或 Tabular Editor 3(商业)。
设置:
- 从 GitHub 下载 Tabular Editor 2(免费、开源)
- 在 Power BI Desktop 中:外部工具 → 表格编辑器
- 表格编辑器打开并连接到打开的 Power BI 模型
创建时间智能计算组:
- 在表格编辑器中,右键单击表格 → 新建 → 计算组
- 将其命名为
Time Intelligence - 该组自动创建一列 - 将其重命名为
Time Calculation4.右键单击该组→添加计算项→为每个项命名
计算项目:本期(基准)
SELECTEDMEASURE()
该项目按原样返回度量,不进行修改。当选择此项时,每个测量都会显示其正常值。
计算项目:上一年
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR('Date'[Date])
)
计算项目:年初至今
CALCULATE(
SELECTEDMEASURE(),
DATESYTD('Date'[Date])
)
计算项目:上一年年初至今
CALCULATE(
SELECTEDMEASURE(),
DATESYTD(SAMEPERIODLASTYEAR('Date'[Date]))
)
计算项目:同比变化
SELECTEDMEASURE() -
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR('Date'[Date])
)
计算项目:同比变化%
DIVIDE(
SELECTEDMEASURE() -
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR('Date'[Date])
),
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR('Date'[Date])
),
BLANK()
)
创建这些项目后,保存在表格编辑器 (Ctrl+S) 中。更改会同步回 Power BI Desktop。
在报告中,使用 Time Calculation 列添加切片器。当用户选择“上一年”时,任何矩阵或图表中的每个度量都会自动显示其上一年的值。
FORMAT 字符串技术
YoY Change % 项目出现了一个问题:它返回小数(0.15 表示 15% 的增长),但基本度量的格式字符串适用于货币(例如“$#,0”)。百分比显示为“$0.15”——格式错误。
解决办法是在计算项上设置格式字符串表达式。在表格编辑器中,每个计算项都有一个“格式字符串表达式”属性,该属性可以包含返回要使用的格式字符串的 DAX 表达式:
同比变化%的格式化字符串表达式:
"0.0%"
货币金额的格式字符串表达式:
"$#,0"
基于所选度量的动态格式字符串:
IF(
ISSELECTEDMEASURE([Units Sold], [Order Count]),
"#,0",
"$#,0.00"
)
格式字符串表达式使用 ISSELECTEDMEASURE() 来检测上下文中的基本度量并返回适当的格式字符串。这就是单个“YoY Change %”计算项目可以格式化为收入度量的百分比和单位度量的计数变化的方式。
货币换算计算组
货币转换是另一个经典的计算组用例。如果没有计算组,具有 3 种货币的 40 个度量的模型需要 120 个度量。有了一个计算组,就需要原来的40个加上3个计算项。
设置:模型必须具有一个 CurrencyRates 表,其中包含按货币和日期划分的汇率,以及一个用于切片器的 Currency 维度表。
计算项目:美元(基础货币)
SELECTEDMEASURE()
计算项目:欧元
SUMX(
VALUES('Date'[Date]),
CALCULATE(SELECTEDMEASURE()) *
CALCULATE(
MAX(CurrencyRates[Rate]),
CurrencyRates[ToCurrency] = "EUR"
)
)
计算项目:英镑
SUMX(
VALUES('Date'[Date]),
CALCULATE(SELECTEDMEASURE()) *
CALCULATE(
MAX(CurrencyRates[Rate]),
CurrencyRates[ToCurrency] = "GBP"
)
)
SUMX 循环迭代每个日期并应用该日期的汇率 - 即使日期切片器跨越具有不同汇率的时期,也能正确处理货币。将货币组的 Precedence 设置为低于时间智能组(在表格编辑器术语中,数字越小 = 优先级越高)。
多个计算组之间的优先规则
当用户同时从两个计算组中选择项目(例如,时间智能中的“上一年”和货币中的“欧元”)时,Power BI 将按优先顺序评估它们。
优先级在每个计算组上设置为整数 - 较高的整数 = 首先计算(或“外部”)。
示例:
- 时间智能:优先级 = 20(内部评估)
- 货币转换:优先级 = 10(评估外部)
通过此设置,货币转换项会环绕时间智能项。选择“欧元”+“上一年”计算:将上一年值(内部计算)转换为欧元(外部计算)。优先顺序必须与计算的语义意图相匹配。
经验法则:修改日期上下文(时间智能)的计算组应该具有更高的优先级(较低的优先级数字,内部/稍后评估)。在日期计算(货币换算、单位换算)后修改值的计算组应具有较低的优先级(评估外部/首先)。
从计算组中排除特定度量
并非每个度量都应响应每个计算组。返回当前报告日期的“报告日期”度量不应由时间智能进行修改。每年设定的“目标价值”度量不应转换为上一年。
在计算项中使用 ISSELECTEDMEASURE() 排除特定度量:
IF(
ISSELECTEDMEASURE([Report Date], [Target Value], [Budget]),
SELECTEDMEASURE(),
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR('Date'[Date])
)
)
这使得“上一年”项目在[报告日期]、[目标值]和[预算]中保持不变——无论时间智能选择如何,都会返回其正常值。
使用计算组进行假设场景分析
计算组可实现优雅的假设场景分析。包含“基本案例”、“乐观”和“悲观”等项目的“场景”计算组可以将场景乘数应用于收入和成本度量,而无需创建场景特定的度量变体。
-- Base Case calculation item
SELECTEDMEASURE()
-- Optimistic calculation item
SWITCH(
TRUE(),
ISSELECTEDMEASURE([Revenue], [Gross Profit]), SELECTEDMEASURE() * 1.15,
ISSELECTEDMEASURE([Operating Expenses], [COGS]), SELECTEDMEASURE() * 0.95,
SELECTEDMEASURE()
)
-- Pessimistic calculation item
SWITCH(
TRUE(),
ISSELECTEDMEASURE([Revenue], [Gross Profit]), SELECTEDMEASURE() * 0.85,
ISSELECTEDMEASURE([Operating Expenses], [COGS]), SELECTEDMEASURE() * 1.10,
SELECTEDMEASURE()
)
用户从切片器中选择场景;每项财务指标都会更新以反映所选情景的假设。将此与时间情报组结合起来可以:“显示乐观情景下第三季度的收入与上一年的比较。”
常见问题
计算组是否可以在没有 Premium 的情况下在 Power BI Desktop 中工作?
是的。计算组适用于所有 Power BI 许可证层 - 它们是语义模型功能,而不是高级功能。唯一的高级要求是必须使用表格编辑器来创建它们,因为 Power BI Desktop 的本机 UI 不支持创建(但它会正确呈现和评估它们)。在表格编辑器中创建后,计算组可以在任何工作区中工作,包括免费版和专业版。
我可以在没有表格编辑器的情况下创建计算组吗?
在 Power BI Desktop 本机 UI 中,无法直接创建计算组(截至 2026 年初)。 Tabular Editor 2(免费)是标准工具。或者,XMLA 端点工具(SSMS、ALM Toolkit)可以通过 TMSL 脚本创建计算组。一些用户还通过 XMLA REST API 调用以编程方式创建计算组。 Microsoft 已表示计划在未来版本中将计算组创建添加到 Power BI Desktop 中。
计算组对性能有何影响?
与手动创建等效度量相比,计算组增加的开销最小。每个 SELECTEDMEASURE() 评估都会调用引用度量的 DAX — 除了等效的显式度量会产生的额外成本之外,不会产生任何额外成本。事实上,计算组通常通过用共享相同评估路径的较少项替换许多类似的显式度量(它们都生成查询缓存条目)来提高模型性能。
计算组可以与自动生成列中的隐式度量一起使用吗?
计算组适用于模型中定义的显式 DAX 度量。它们不适用于 Power BI 自动生成的列聚合(例如对没有定义度量的数字列求和)。最佳实践是为所有业务指标定义显式度量,并对这些度量使用计算组。
计算组如何与行级安全性交互?
计算组和行级安全性是正交的——它们独立运行。 RLS 过滤哪些行对用户可见;计算组修改这些可见行的度量的计算方式。该组合工作正常:RLS 限制数据,然后计算组的项目转换测量逻辑。正确实施的 RLS 和计算组之间不存在已知的冲突。
计算组和字段参数有什么区别?
计算组修改度量的计算方式(应用时间平移、货币换算、方案调整)。字段参数允许用户选择可视化中显示的度量或列,例如在图表中的收入、利润和单位之间交换。它们解决不同的问题并且可以一起使用:用于选择基本度量的字段参数,用于选择该度量的时间比较的计算组。
后续步骤
计算组是用于构建可维护、可扩展的 Power BI 语义模型的最强大工具之一。如果实施正确,它们可以消除 DAX 重复,降低模型复杂性,并使模型具有可扩展性——添加新的时间智能周期意味着添加一个计算项,而不是重写数十个度量。
ECOSIRE 的 Power BI 数据建模服务 包括计算组设计和实现,作为语义模型开发的一部分。联系我们讨论计算组如何简化您当前的模型或改进您的下一个实施。
作者
ECOSIRE Research and Development Team
在 ECOSIRE 构建企业级数字产品。分享关于 Odoo 集成、电商自动化和 AI 驱动商业解决方案的洞见。
相关文章
Building Financial Dashboards with Power BI
Step-by-step guide to building financial dashboards in Power BI covering data connections to accounting systems, DAX measures for KPIs, P&L visualisations, and best practices.
Case Study: Power BI Analytics for Multi-Location Retail
How a 14-location retail chain unified their reporting in Power BI connected to Odoo, replacing 40 spreadsheets with one dashboard and cutting reporting time by 78%.
GoHighLevel + Power BI: Advanced Reporting and Analytics
Connect GoHighLevel to Power BI for advanced marketing analytics. Build executive dashboards, track multi-channel ROI, and create automated reports that go beyond GHL's native reporting.