注意
视觉计算目前以 预览版提供。
视觉计算是直接在视觉对象上定义和执行的 DAX 计算。 通过视觉计算,可以更轻松地创建以前难以创建的计算,从而简化 DAX、简化维护,带来更好的性能。
下面是一个视觉计算示例,用于定义销售金额的累加和。 请注意,所需的 DAX 非常简单:
Running sum = RUNNINGSUM([Sales Amount])
计算可以引用视觉对象(包括列、度量值或其他视觉对象计算)中的任何数据。 此功能消除了语义模型的复杂性,并简化了编写 DAX 的过程。 可以使用视觉计算来完成常见的业务计算,例如累加总和或移动平均。
视觉计算不同于 DAX 中的其他计算选项:
视觉对象计算不会存储在模型中,而是存储在视觉对象上。 这意味着视觉对象计算只能引用视觉对象上的内容。 必须先将模型中的任何内容添加到视觉对象,然后视觉计算才能引用该视觉对象,从而释放视觉计算,使其与筛选器上下文和模型的复杂性相关。
视觉计算将计算列中上下文的简单性与度量值的按需计算灵活性相结合。
与度量值相比,视觉计算对聚合数据(而不是细节级别)进行操作,通常会带来性能优势。 当可以通过新度量值或视觉计算实现计算时,后者通常会带来更好的性能。
由于视觉计算是视觉对象的一部分,因此可以引用视觉结构,从而提高灵活性。
有关在 Power BI 中添加计算方式的更深入比较,请参阅在 Power BI Desktop 中使用计算选项。
启用视觉计算后,可以:
- 向报表添加视觉计算
- 隐藏某些字段
- 使用模板快速创建视觉计算
- 通过引用视觉对象的轴进行灵活的视觉计算
以下部分详细介绍了前面项目符号中描述的每个元素会如何处理视觉计算。
启用视觉计算
2024 年 9 月之前,若要使用视觉计算,必须在“选项和设置”>“选项”>“预览功能”中启用它。 选择视觉计算,然后选择“确定”。 重启 Power BI Desktop 后,将启用视觉计算。
从 2024 年 9 月开始,不再需要此步骤,因为默认情况下启用视觉计算。 虽然它们仍处于预览状态,但可以使用上述设置来禁用视觉计算(如果愿意)。
添加视觉计算
若要添加视觉计算,请选择一个视觉对象,然后选择功能区中的“新建视觉计算”按钮:
视觉计算窗口将在 编辑 模式下打开。 “编辑”模式屏幕由三个主要部分组成,如下图所示:
- 视觉对象预览会显示你正在使用的视觉对象
- 公式栏,可在其中添加视觉计算
- 视觉对象矩阵显示视觉对象中的数据,并在添加视觉对象计算时显示视觉对象计算结果。 应用于视觉对象的任何样式或主题都不适用于视觉对象矩阵。
若要添加视觉计算,请在编辑栏中键入表达式。 例如,在包含 Sales Amount 和 Total Product Cost by Fiscal Year 的视觉对象中,可以通过键入以下内容添加视觉计算来计算每年的利润:
Profit = [Sales Amount] – [Total Product Cost]
默认情况下,视觉对象上的大多数视觉计算会按行计算,如计算列。 在上一个示例中,对于视觉矩阵的每一行,当前 销售额 和 总产品成本 相减,结果在 利润 列中返回。 虽然可以,但没有必要像在度量中那样添加 SUM 这样的聚合函数。 事实上,最好不要在不需要聚合时添加此类聚合,因此可以更轻松地区分度量值和视觉计算表达式。
添加视觉计算时,它们将显示在视觉对象的字段列表中:
此外,视觉对象上还会显示视觉计算:
可以在视觉计算中使用许多现有的 DAX 函数。 还可以使用特定于视觉计算的函数。 由于视觉计算在视觉矩阵的范围内工作,因此不能使用依赖于模型关系(如 USERELATIONSHIP、RELATED 或 RELATEDTABLE)的函数。
隐藏视觉对象中的字段
在视觉计算编辑模式下,可以隐藏视觉对象的字段,就像在建模视图中隐藏列和表一样。 例如,如果只想显示利润视觉计算,则可以从视图中隐藏销售额和总利润成本:
隐藏字段不会从视觉对象或视觉对象矩阵中删除它们,因此视觉计算仍可以引用它们并继续工作。 隐藏的字段仍会显示在视觉对象矩阵上,但不会显示在生成的视觉对象上。 建议仅在视觉计算正常运行时包含隐藏字段。
使用模板
视觉计算包括模板,以便更轻松地编写常见计算。 可以通过选择模板按钮并选择要使用的模板来查找模板:
还可以通过单击“新建视觉计算”按钮的 底部,从功能区创建模板化视觉计算 。
提供以下模板:
- 运行求和。 计算值的总和,将当前值与前面的值相加。 使用 RUNNINGSUM 函数。
- 移动平均。 通过将值的总和除以窗口的大小,计算给定窗口中一组值的平均值。 使用 MOVINGAVERAGE 函数。
- 父级百分比。 计算相对于其父级的值的百分比。 使用 COLLAPSE 函数。
- 占总计的百分比。 使用 COLLAPSEALL 函数计算值相对于所有值的百分比。
- 子级的平均值。 计算子值集的平均值。 使用 EXPAND 函数。
- 与上一个相比。 使用 PREVIOUS 函数将值与前面的值进行比较。
- 与下一个相比。 使用 NEXT 函数将值与后续的值进行比较。
- 与第一个相比。 使用 FIRST 函数将值与第一个值进行比较。
- 与最后一个相比。 使用 LAST 函数将值与最后一个值进行比较。
- 查找具有上下文的值。 使用 LOOKUP 函数在当前上下文中的视觉矩阵上查找值或计算表达式。
- 查找含有总计的数值。 使用 LOOKUPWITHTOTALS 函数在具有总计的视觉矩阵上查找值或计算表达式。
选择模板会将模板插入编辑栏中。 可以将这些模板用作起点。 还可以添加自己的表达式,而无需依赖模板。
参数选取器
通过参数选取器,可以轻松地在视觉计算函数中选择参数的值。 例如,我们在此处加载了 查找带总计的值 模板:
还可以使用 Ctrl+SPACE 键盘快捷方式激活参数选取器。
Axis
许多函数都有一个可选的 Axis 参数,该参数只能在视觉计算中使用。 Axis 影响视觉计算遍历视觉矩阵的方式。 默认情况下,Axis 参数设置为视觉对象中的第一个轴。 对于许多视觉对象,第一个轴是ROWS,这意味着视觉计算在视觉矩阵中是逐行从上到下进行评估的。 下表显示了 Axis 参数的有效值:
Axis 图标 | Axis 名称 | 说明 |
---|---|---|
![]() |
ROWS | 从上到下垂直计算各行。 |
![]() |
COLUMNS | 从左到右横向计算各列。 |
![]() |
ROWS COLUMNS | 从上到下垂直计算各行,然后从左到右横向计算各列。 |
![]() |
COLUMNS ROWS | 从左到右横向计算各列,然后从上到下垂直计算各行。 |
注意
如果指定在可视化中不存在的轴,则忽略该轴。
Reset
许多函数都有一个可选的 Reset 参数,该参数只能在视觉计算中可用。 在遍历视觉矩阵时,如果函数将其值重置为 0 或切换到其他范围,则 Reset 会影响其值。 它通过对目标列进行分区来执行此作。 在分区中执行计算时,在分区中划分列的方式决定了计算是否重置。 参数 Reset 默认设置为 NONE ,这意味着永远不会重启视觉计算。 该 Reset 参数接受不同类型的值:
- 整数
- 列引用
- 特殊同义词: HIGHESTPARENT, , LOWESTPARENTNONE
在每种情况下,它都会在视觉计算层次结构中指定一个级别(让我们将其称为目标级别)。 但是,计算中解释此级别的方式可能有所不同。 该 Reset 行为以两种不同的模式运行: 绝对 模式和 相对模式。
对参数或其等效值 NONE、HIGHESTPARENT 和 LOWESTPARENT 使用整数值时,可以通过整数的信号在这两种模式之间进行选择:正值在绝对模式下执行重置,负值在相对模式下执行重置(零则保持默认行为,不进行重置)。
如果指定列引用,则还会以绝对模式运行。 这些值决定了目标列的分区方式,以及其是否会被重置。 以下部分介绍了这两种模式:
绝对模式
此模式指示计算应按目标列及其上方的所有列进行分区,这在计算的每个级别都适用。 在目标以上的级别(即目标列不存在的地方,可能还有其他列),计算将根据可用的其余列进行分区。 正整数值标识从顶部开始的目标列(顶部列为 1、下一列为 2 等)。 它的值最多为 N(层次结构中的列数),超出该值的部分将被截断。 另外,也可以直接指定列。
例如,考虑具有以下层次结构级别的可视计算:年、季度、月和日。 下表显示如何根据以下值 Reset在每个级别对计算进行分区:
级别/值 | Reset = 1 或年份 | Reset = 2 或季度 | Reset = 3 或月份 | Reset = 4 或日 |
---|---|---|---|---|
日级别 | 年份 | 季度和年份 | 月份、季度和年份 | 日、月、季度和年 |
月级别 | 年份 | 季度和年份 | 月份、季度和年份 | 月份、季度和年份 |
季度级别 | 年份 | 季度和年份 | 季度和年份 | 季度和年份 |
年份级别 | 年份 | 年份 | 年份 | 年份 |
总计级别 | 没有 | 没有 | 没有 | 没有 |
相对模式
给定负整数值 –X,在每一级别,计算由层次结构中所有列 X 级别或更高的列进行分区(如果没有此类级别,则根本不分区)。 此模式的有效值介于 -1 和 -N+1 之间(其中 N 是层次结构中的列数),并剪裁任何较低的值。 同样,请考虑前面所述的视觉计算。 下表显示了如何根据重置值在每个级别对计算进行分区:
级别/值 | Reset = -1 | Reset = -2 | Reset = -3 |
---|---|---|---|
日级别 | 月份、季度和年份 | 季度和年份 | 年份 |
月级别 | 季度和年份 | 年份 | 没有 |
季度级别 | 年份 | 没有 | 没有 |
年份级别 | 没有 | 没有 | 没有 |
总计级别 | 没有 | 没有 | 没有 |
同义词
Reset 还提供以下同义词:
- 默认值为 NONE。 它不会重置计算,并且等效于 0。
- HIGHESTPARENT 按最高级别执行绝对重置,等效于 1。
- LOWESTPARENT 通过其直接父级执行相对重置,相当于 -1。
Reset 的使用示例
例如,请考虑前面所述的视觉计算。 这些视觉计算是等效的,无论计算在哪个级别进行,它们都返回每年重启的“销售额”的总和(请参阅绝对模式):
RUNNINGSUM([Sales Amount], HIGHESTPARENT)
RUNNINGSUM([Sales Amount], 1)
RUNNINGSUM([Sales Amount], [Year])
相比之下,以下视觉计算都返回从每个直接父级开始计为 0 的销售额总和,具体取决于计算的级别(请参阅相对模式)。
RUNNINGSUM([Sales Amount], LOWESTPARENT)
RUNNINGSUM([Sales Amount], -1)
最后,此视觉计算不会重置,会继续将每月的“销售额”值与以前的值相加,而不会重启。
RUNNINGSUM([Sales Amount])
Axis 和 Reset 对比 ORDERBY 和 PARTITIONBY
Axis、Reset、ORDERBY 和 PARTITIONBY 这 4 个函数可成对使用或一起使用来影响计算的计算方式。 它们形成两对,通常成对一起使用:
- Axis 和 Reset
- ORDERBY 和 PARTITIONBY
Axis 和 Reset 仅适用于可在视觉计算中使用的函数,并且只能在视觉计算中使用,因为它们会引用视觉结构。 ORDERBY 和 PARTITIONBY 函数可用于计算列、度量值和视觉计算并引用字段。 虽然它们执行相同的函数,但它们在提供的抽象级别不同;引用视觉结构比使用 ORDERBY 或 PARTITIONBY 显式引用字段更灵活。
重置要求轴上有多个级别。 如果轴上没有多个级别(要么是因为轴上只有一个字段或一个级别的多个字段)则可以使用 PARTITIONBY。
指定任一对效果都很好,但也可以一起指定 Axis、ORDERBY 和/或 PARTITIONBY,在这种情况下,为 ORDERBY 和 PARTITIONBY 指定的值将替代 Axis 指定的值。 Reset 不能与 ORDERBY 和 PARTITIONBY 结合使用。
可以通过显式指定字段来将 ORDERBY 和 PARTITIONBY 对视为固定字段引用,其中 Axis 和 Reset 是与结构无关的字段,它们指的是结构和结构上正在使用的任何字段。
可用函数
可以在视觉计算中使用许多现有的 DAX 函数。 由于视觉计算在视觉矩阵的范围内工作,因此依赖于模型关系(如 U标准版RELATIONSHIP、RELATED 或 RELATEDTABLE)的函数不可用。
视觉计算还引入了一组特定于视觉计算的函数。 其中许多函数更易于使用 DAX 窗口函数的快捷方式。
函数 | 说明 | 示例 | 快捷方式 |
---|---|---|---|
COLLAPSE | 计算在轴的较高级别计算。 | 父级百分比 = DIVIDE([Sales Amount], COLLAPSE([Sales Amount], ROWS)) | 空值 |
COLLAPSEALL | 计算在轴的总级别计算。 | 总计百分比 = DIVIDE([Sales Amount], COLLAPSEALL([Sales Amount], ROWS)) | 空值 |
EXPAND | 计算在轴的较低级别计算。 | 子级平均值 = EXPAND(AVERAGE([Sales Amount]), ROWS) | 空值 |
EXPANDALL | 计算在轴的叶级别计算。 | 叶级别的平均值 = EXPANDALL(AVERAGE([Sales Amount]), ROWS) | 空值 |
FIRST | 指轴的第一行。 | ProfitVSFirst = [Profit] – FIRST([Profit]) | INDEX(1) |
ISATLEVEL | 报告指定列是否存在于当前级别。 | IsFiscalYearAtLevel = ISATLEVEL([财政年度]) | 空值 |
LAST | 指轴的最后一行。 | ProfitVSLast = [Profit] – LAST([Profit]) | INDEX(-1) |
LOOKUP | 使用当前上下文计算视觉矩阵中的表达式。 | LookupSalesFor2025WithContext = LOOKUP(SUM([Sales]) [Year], “2025”) | 空值 |
LOOKUPWITHTOTALS | 计算具有总计的视觉矩阵中的表达式。 | LookupSalesFor2025WithTotals = LOOKUPWITHTOTALS(SUM([Sales]), [Year], “2025”) | 空值 |
MOVINGAVERAGE | 在轴上添加移动平均。 | MovingAverageSales = MOVINGAVERAGE([销售额], 2) | WINDOW |
NEXT | 指轴的下一行。 | ProfitVSNext = [Profit] – NEXT([Profit]) | OFFSET(1) |
PREVIOUS | 指轴的上一行。 | ProfitVSPrevious = [Profit] - PREVIOUS([Profit]) | OFFSET(-1) |
RANGE | 指轴的行的切片。 | AverageSales = AVERAGEX(RANGE1), [Sales Amount]) | WINDOW |
RUNNINGSUM | 在轴上添加一个正在运行的求和。 | RunningSumSales = RUNNINGSUM([销售金额]) | WINDOW |
设置视觉对象计算的格式
可使用数据类型和格式设置选项设置视觉计算的格式。 还可以设置自定义视觉级别格式字符串。 在视觉对象的“格式设置”窗格的“常规”部分中,使用“数据格式”选项设置格式:
示例 1:使用视觉计算返回条件格式的十六进制颜色代码
步骤 1:选择要在其中使用条件格式的视觉对象:
步骤 2:在“开始”选项卡下选择“新建视觉计算”按钮:
步骤 3:撰写你的视觉计算。 下面是基于度量值大于 .5 返回绿色或红色的 IF 语句:
Conditional Hex Code = IF ( [Progress] > .5, "#5BA300", "#E91C1C" )
步骤 4:展开“格式设置”窗格,然后选择“ 属性”
步骤 5:展开 “数据格式” 部分,选择视觉对象计算,并将“数据类型”和“格式”设置为 “文本”:
步骤 6:退出可视化计算编辑器之前,在构建部分,可视化计算旁边单击隐藏图标来隐藏它。
步骤 7:在条件格式部分中使用它:
步骤 8:单击“ 返回报表 ”按钮退出视觉计算编辑器:
步骤 9:享受条件格式的视觉对象!
注意事项和限制
视觉计算目前处于预览状态,在预览期间,应注意以下注意事项和限制:
- 并非所有视觉对象类型都受支持。 使用视觉计算编辑模式更改视觉对象类型。 此外,自定义视觉对象尚未使用视觉计算或隐藏字段进行测试。
- 已测试以下视觉对象类型和视觉属性,并发现无法处理视觉计算或隐藏字段:
- 切片器
- R 视觉对象
- Python 视觉对象
- 关键影响因素
- 分解树
- 问答
- 智能叙述
- 指标
- 分页报表
- Power Apps
- Power Automate
- 小型序列图
- 散点图上的播放轴
- 此功能的性能并不代表最终产品。
- 无法使用复制/粘贴或其他机制重复使用视觉计算。
- 无法筛选视觉计算。
- 视觉计算不能以相同或不同的详细信息级别引用自身。
- 视觉计算或隐藏字段的个性化设置不可用。
- 不能将使用视觉计算或隐藏字段的视觉对象固定到仪表板。
- 无法将发布到 Web功能与使用视觉计算或隐藏字段的报表一起使用。
- 从视觉对象导出数据时, 基础数据 导出中不包含视觉计算结果。 隐藏字段永远不会包含在导出中,除非导出 基础数据。
- 无法将查看记录钻取功能与使用视觉计算或隐藏字段的视觉对象一起使用。
- 无法对视觉计算设置数据类别。
- 无法在视觉计算上更改聚合。
- 无法更改视觉计算的排序顺序。
- 使用视觉计算或隐藏字段的报表不支持 Power BI Embedded。
- 不支持与在版本 2025 之前发布的 SQL Server Analysis Services 版本的实时连接。
- 尽管可以对视觉计算使用 字段参数 ,但它们有一些限制。
- 显示没有数据的项在视觉对象计算中不可用。
- 无法将数据限制用于视觉计算。
- 不能在视觉计算上设置动态格式字符串,也不能将视觉计算用作字段或度量值的动态格式字符串。
相关内容
有关使用视觉对象计算的详细信息,请参阅以下资源: