适用于: SQL Server 2019 及更高版本 Analysis Services
Azure Analysis Services
Fabric/Power BI Premium
通过将常见度量值表达式分组为“计算项”,计算组可显著减少冗余度量值的数量 。 支持计算组的表格模型需要在 1500 或更高的 兼容级别。
优点
计算组解决了复杂模型中的问题,在这些模型中,可以使用相同的计算来激增冗余度量值,这与时间智能计算最为常见。 例如,销售分析师希望查看截至本月(MTD)、本季度(QTD)、本年度(YTD)和上一年度的订单(PY)等的销售总额和订单。 数据建模器必须为每个计算创建单独的度量值,这可能导致数十个度量值。 对于用户,这可能意味着必须对同样多的度量值进行排序,并将它们单独应用于报表。
让我们首先看看计算组在 Power BI 等报表工具中向用户显示的方式。 然后,我们将了解构成计算组的内容,以及如何在模型中创建计算组。
计算组在报告客户端中显示为具有单个列的表。 该列区别于典型的列或维度,它代表一个或多个可重用的计算,或 计算项,这些计算项可以应用于任何已添加到可视化的数值过滤器中的度量。
在以下动画中,用户正在分析 2012 年和 2013 年的销售数据。 在应用计算组之前,常见的基本度量项 Sales 计算每个月的总销售额。 然后,用户希望应用时间智能计算,以便获取当月至今、当季至今和当年至今的销售总额等。 如果没有计算组,用户必须选择单个时间智能度量值。
在这个例子中,名为时间智能的计算组中,当用户将时间计算项拖到列筛选区域时,每个计算项都会作为单独的列显示。 每行的值是从基本度量值 Sales 计算得出的。
计算组使用 显式 DAX 度量值。 在此示例中, Sales 是已在模型中创建的显式度量值。 计算组无法与隐式 DAX 度量值一起工作。 例如,在 Power BI 中,当用户将列拖到可视化对象上以查看聚合值时,会自动创建隐式度量值,而无需用户创建显式度量值。 目前,Power BI 会为编写为内联 DAX 计算的隐式度量值生成 DAX,这意味着隐式度量值无法与计算组一起使用。 已引入表格对象模型(TOM)中可见的新模型属性 ,“DiscourageImplicitMeasures”。 目前,若要创建计算组,必须将此属性设置为 true。 设置为 true 时,Live Connect 模式下的 Power BI Desktop 将禁用隐式度量值的创建。
计算组还支持多维数据表达式 (MDX) 查询。 这意味着,使用MDX查询表格数据模型的Microsoft Excel用户,可以在工作表透视表和图表中充分利用计算组。
工作原理
现在,你已了解计算组如何使用户受益,接下来让我们看看如何创建时间智能计算组示例。
在深入了解详细信息之前,让我们介绍一些专门针对计算组的新 DAX 函数:
SELECTEDMEASURE - 被用来为计算项中的表达式引用当前上下文中的度量。 在此示例中,销售指标。
SELECTEDMEASURENAME - 表达式用于计算项,根据名称确定当前上下文中的度量。
ISSELECTEDMEASURE - 表达式用于计算项,以确定与上下文相关的度量值是否在指定的度量值列表中。
SELECTEDMEASUREFORMATSTRING - 表达式用于计算项中,以获取上下文中度量值的格式字符串。
时间智能示例
表名 - 时间智能
列名 - 时间计算
优先级 - 20
时间智能计算项
当前
SELECTEDMEASURE()
MTD
CALCULATE(SELECTEDMEASURE(), DATESMTD(DimDate[Date]))
QTD
CALCULATE(SELECTEDMEASURE(), DATESQTD(DimDate[Date]))
YTD
CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))
PY
CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(DimDate[Date]))
PY MTD
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR(DimDate[Date]),
'Time Intelligence'[Time Calculation] = "MTD"
)
PY QTD
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR(DimDate[Date]),
'Time Intelligence'[Time Calculation] = "QTD"
)
PY YTD
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR(DimDate[Date]),
'Time Intelligence'[Time Calculation] = "YTD"
)
YOY
SELECTEDMEASURE() -
CALCULATE(
SELECTEDMEASURE(),
'Time Intelligence'[Time Calculation] = "PY"
)
YOY%
DIVIDE(
CALCULATE(
SELECTEDMEASURE(),
'Time Intelligence'[Time Calculation]="YOY"
),
CALCULATE(
SELECTEDMEASURE(),
'Time Intelligence'[Time Calculation]="PY"
)
)
若要测试此计算组,请执行以下 DAX 查询。 注意:从此查询示例中省略 MTD、YOY 和 YOY%。
时间智能分析查询
EVALUATE
CALCULATETABLE (
SUMMARIZECOLUMNS (
DimDate[CalendarYear],
DimDate[EnglishMonthName],
"Current", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "Current" ),
"QTD", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "QTD" ),
"YTD", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "YTD" ),
"PY", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY" ),
"PY QTD", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY QTD" ),
"PY YTD", CALCULATE ( [Sales], 'Time Intelligence'[Time Calculation] = "PY YTD" )
),
DimDate[CalendarYear] IN { 2012, 2013 }
)
时间智能查询返回
返回表格显示了针对每个应用的计算项的计算结果。 例如,请参阅 2012 年 3 月的 QTD 是 2012 年 1 月、2 月和 3 月的总和。
动态格式字符串
使用计算组的动态格式字符串允许条件应用格式字符串以度量值,而无需强制它们返回字符串。
表格模型使用 DAX 的 FORMAT 函数支持度量值的动态格式。 但是,FORMAT 函数有返回字符串的缺点,强制将其他数字形式的度量值作为字符串返回。 这可能有一些限制,例如,与大多数依赖于数值的 Power BI 视觉对象(如图表)不兼容。
在 Power BI 中,度量值的动态格式字符串还允许条件性地将格式字符串应用于特定度量值,而无需强制它们返回字符串,而无需使用计算组。 若要了解详细信息,请参阅 度量值的动态格式字符串。
用于时间智能的动态格式字符串
如果查看上面所示的时间智能示例,除 YOY% 之外的所有计算项都应在上下文中使用当前度量值的格式。 例如,在销售基准度量值上计算的 YTD 应为货币。 如果这是订单基础度量的计算组,则格式将为数字。 但是,无论基本度量值的格式如何,YOY%都应是百分比。
对于 YOY%,我们可以通过将格式字符串表达式属性设置为 0.00%;-0.00%;0.00%来替代格式字符串。 若要了解有关设置字符串表达式属性格式的详细信息,请参阅 MDX 单元格属性 - FORMAT STRING 内容。
在此 Power BI 中的矩阵视觉对象中,可以看到 Sales Current/YOY 和 Orders Current/YOY 保留各自的基本度量值格式字符串。 销售 YOY% 和 订单 YOY% 的格式字符串都被替代为使用 百分比 格式。
用于货币转换的动态格式字符串
动态格式字符串提供简单的货币换算。 请考虑以下 Adventure Works 数据模型。 它针对由转换类型定义的一对多货币换算建模。
FormatString 列被添加到 DimCurrency 表中,并为相应的货币填充格式字符串。
在此示例中,将定义以下计算组:
货币换算示例
表名 - 货币换算
列名 - 转换计算
优先级 - 5
货币转换计算项
无转换
SELECTEDMEASURE()
转换后的货币
IF(
//Check one currency in context & not US Dollar, which is the pivot currency:
SELECTEDVALUE( DimCurrency[CurrencyName], "US Dollar" ) = "US Dollar",
SELECTEDMEASURE(),
SUMX(
VALUES(DimDate[Date]),
CALCULATE( DIVIDE( SELECTEDMEASURE(), MAX(FactCurrencyRate[EndOfDayRate]) ) )
)
)
格式字符串表达式
SELECTEDVALUE(
DimCurrency[FormatString],
SELECTEDMEASUREFORMATSTRING()
)
注释
计算组的选择表达式可用于在计算组上实现自动货币换算,无需具有两个单独的计算项。
格式字符串表达式必须返回标量字符串。 它使用新的 SELECTEDMEASUREFORMATSTRING 函数在筛选器上下文中存在多个货币时还原为基本度量值格式字符串。
以下动画显示了报表中 Sales 度量值的动态格式货币转换。
选择表达式
选择表达式是为计算组定义的可选属性。 有两种类型的选择表达式:
-
multipleOrEmptySelectionExpression。 在以下情况下应用此选择表达式:
- 已选择多个计算项,
- 已选择非现有计算项,或
- 已选择了有冲突的选项。
- noSelectionExpression。 如果未筛选计算组,则应用此选择表达式。
这两个选择表达式都具有 formatStringDefinition 动态格式字符串 表达式。
总之,可以在计算组中定义以下内容,例如通过 TMDL 进行定义:
...
table Scenarios
calculationGroup
...
multipleOrEmptySelectionExpression = <expression>
formatStringDefinition = <format string>
noSelectionExpression= <expression>
formatStringDefinition = <format string>
...
注释
这些表达式(如果指定)仅适用于提到的特定情况。 单个计算项的选择不受这些表达式的影响。
下面是这些表达式及其默认行为的概述(如果未指定):
选择类型 | 未定义选择表达式(默认值) | 定义的选择表达式 |
---|---|---|
单选 | 已应用所选内容 | 已应用所选内容 |
多选 | 计算组未被筛选 | 返回计算 multipleOrEmptySelectionExpression 的结果 |
空选择 | 计算组未被筛选 | 返回计算 multipleOrEmptySelectionExpression 的结果 |
无选择 | 计算组未被筛选 | 返回计算 noSelectionExpression 的结果 |
注释
使用 模型的选择表达式行为设置 来进一步确定当选择表达式未定义时计算组返回的结果。
SelectionExpressionBehavior 模型设置
模型具有 selectionExpressionBehavior 设置,可进一步控制该模型中的计算组的行为方式。 此设置接受以下三个值:
- 自动。 这是默认值,与 非视觉 相同。 这可确保现有模型不会更改行为。 将来兼容级别设为自动的模型将改用视觉。 届时将有公告。
-
非视觉。 如果计算组未定义 multipleOrEmptySelection 表达式,则计算组将
SELECTEDMEASURE()
返回计算组,并在按计算组分组时隐藏分类汇总值。 -
Visual。 如果计算组未定义 multipleOrEmptySelection 表达式,则计算组返回
BLANK()
。 按计算组分组时,小计值根据计算组上下文中的所选度量值来确定。
使用 TMDL 在模型上设置属性:
createOrReplace
model Model
...
selectionExpressionBehavior: <automatic|nonvisual|visual>
...
多项或空白选择
如果对同一计算组进行多个选择,则计算组将计算并返回 multipleOrEmptySelectionExpression 的结果(如果已定义)。 如果未定义此表达式,如果模型的 selectionExpressionBehavior 设置 设置为自动或非visual,则计算组将返回以下结果:
SELECTEDMEASURE()
如果模型的 selectionExpressionBehavior 设置被设为视觉,则计算组将返回:
BLANK()
例如,让我们看看一个名为 MyCalcGroup 的计算组,它配置了一个多选或空选择表达式,如下所示:
IF (
ISFILTERED ( 'MyCalcGroup' ),
"Filters: "
& CONCATENATEX (
FILTERS ( 'MyCalcGroup'[Name] ),
'MyCalcGroup'[Name],
", "
)
)
现在,设想在计算组中有以下选择:
EVALUATE
{
CALCULATE (
[MyMeasure],
'MyCalcGroup'[Name] = "item1" || 'MyCalcGroup'[Name] = "item2"
)
}
在这里,我们在计算组中选择两个项:“item1”和“item2”。 这是一个多重选择,因此会计算 multipleOrEmptySelectionExpression,并返回以下结果:“过滤器:item1,item2”。
接下来,对计算组进行以下选择:
EVALUATE
{
CALCULATE (
[MyMeasure],
'MyCalcGroup'[Name] = "item4" -- item4 does not exists
)
}
这是空选择的示例,因为此计算组上不存在“item4”。 因此,计算 multipleOrEmptySelectionExpression 并返回以下结果:“过滤器:”。
无选择
如果未筛选计算组,则将对计算组应用 noSelectionExpression。 这主要用于执行默认操作,而无需用户采取行动,同时仍为用户提供替代默认操作的灵活性。 例如,让我们来看一下以美元作为中心基准货币的自动货币转换。
我们可以通过以下 noSelectionExpression 来设置计算组:
IF (
//Check one currency in context & not US Dollar, which is the pivot currency:
SELECTEDVALUE (
DimCurrency[CurrencyName],
"US Dollar"
) = "US Dollar",
SELECTEDMEASURE (),
SUMX (
VALUES ( DimDate[DateKey] ),
CALCULATE (
DIVIDE ( SELECTEDMEASURE (), MAX ( FactCurrencyRate[EndOfDayRate] ) )
)
)
)
我们还将为此表达式设置格式字符串定义(formatStringDefinition):
SELECTEDVALUE(
DimCurrency[FormatString],
SELECTEDMEASUREFORMATSTRING()
)
现在,如果未选择任何货币,则所有货币都将根据需要自动转换为基准货币(美元)。 除此之外,你仍然可以选择另一种货币来转换为该货币,而无需切换计算项,因为无需 NoSelectionExpression。
优先权
优先级是为计算组定义的属性。 它指定在计算项中使用 SELECTEDMEASURE() 时,计算组与底层度量结合的顺序。
优先级示例
我们来看一个简单的示例。 此模型具有一个指定值为 10 的度量值,以及两个计算组,每个度量值都有一个计算项。 我们将这两个计算组的计算项应用于度量值。 以下是我们的设置方法:
'Measure group'[Measure] = 10
第一个计算组是 'Calc Group 1 (Precedence 100)'
,计算项为 'Calc item (Plus 2)'
:
'Calc Group 1 (Precedence 100)'[Calc item (Plus 2)] = SELECTEDMEASURE() + 2
第二个计算组是 'Calc Group 2 (Precedence 200)'
,计算项为 'Calc item (Times 2)'
:
'Calc Group 2 (Precedence 200)'[Calc item (Times 2)] = SELECTEDMEASURE() * 2
可以看到计算组 1 的优先级值为 100,计算组 2 的优先级值为 200。
通过使用 SQL Server Management Studio(SSMS)或具有 XMLA 读写 功能的外部工具(如开源表格编辑器),可以使用 XMLA 脚本创建计算组并设置优先值。 我们在此处添加 "Calc group 1 (Precedence 100)"
:
{
"createOrReplace": {
"object": {
"database": "CHANGE TO YOUR DATASET NAME",
"table": "Calc group 1 (Precedence 100)"
},
"table": {
"name": "Calc group 1 (Precedence 100)",
"calculationGroup": {
"precedence": 100,
"calculationItems": [
{
"name": "Calc item (Plus 2)",
"expression": "SELECTEDMEASURE() + 2",
}
]
},
"columns": [
{
"name": "Calc group 1 (Precedence 100)",
"dataType": "string",
"sourceColumn": "Name",
"sortByColumn": "Ordinal",
"summarizeBy": "none",
"annotations": [
{
"name": "SummarizationSetBy",
"value": "Automatic"
}
]
},
{
"name": "Ordinal",
"dataType": "int64",
"isHidden": true,
"sourceColumn": "Ordinal",
"summarizeBy": "sum",
"annotations": [
{
"name": "SummarizationSetBy",
"value": "Automatic"
}
]
}
],
"partitions": [
{
"name": "Partition",
"mode": "import",
"source": {
"type": "calculationGroup"
}
}
]
}
}
}
此脚本添加 "Calc group 2 (Precedence 200)"
:
{
"createOrReplace": {
"object": {
"database": "CHANGE TO YOUR DATASET NAME",
"table": "Calc group 2 (Precedence 200)"
},
"table": {
"name": "Calc group 2 (Precedence 200)",
"calculationGroup": {
"precedence": 200,
"calculationItems": [
{
"name": "Calc item (Times 2)",
"expression": "SELECTEDMEASURE() * 2"
}
]
},
"columns": [
{
"name": "Calc group 2 (Precedence 200)",
"dataType": "string",
"sourceColumn": "Name",
"sortByColumn": "Ordinal",
"summarizeBy": "none",
"annotations": [
{
"name": "SummarizationSetBy",
"value": "Automatic"
}
]
},
{
"name": "Ordinal",
"dataType": "int64",
"isHidden": true,
"sourceColumn": "Ordinal",
"summarizeBy": "sum",
"annotations": [
{
"name": "SummarizationSetBy",
"value": "Automatic"
}
]
}
],
"partitions": [
{
"name": "Partition",
"mode": "import",
"source": {
"type": "calculationGroup"
}
}
]
}
}
}
在 Power BI Desktop 中,我们有一个卡片视觉对象,显示报表视图中每个计算组的度量值和切片器:
选择两个切片器后,我们需要合并 DAX 表达式。 为此,我们从优先级最高的计算项 200 开始,然后将 SELECTEDMEASURE() 参数替换为下一个最高 100。
因此,我们优先级最高的计算项 DAX 表达式为:
SELECTEDMEASURE() * 2
我们的第二个优先级最高的计算项 DAX 表达式是:
SELECTEDMEASURE() + 2
现在,通过将最高优先级计算项的 SELECTEDMEASURE() 部分替换为下一个优先级最高的计算项,将它们组合在一起,如下所示:
( SELECTEDMEASURE() + 2 ) * 2
然后,如果还有更多计算项,我们会继续进行,直到到达基础度量值。 此模型中只有两个计算组,因此我们现在将 SELECTEDMEASURE() 替换为度量值本身,如下所示:
( ( [Measure] ) + 2 ) * 2
就像我们的 Measure = 10,这是相同的:
( ( 10 ) + 2 ) * 2
当没有更多 SELECTEDMEASURE() 参数时,将计算合并的 DAX 表达式:
( ( 10 ) + 2 ) * 2 = 24
在 Power BI Desktop 中,使用切片器应用这两个计算组时,度量值输出如下所示:
但请记住,组合嵌套的方式如下:输出不会为 10 + 2 * 2 = 14,如此处所示:
对于简单的转换,优先级的评估是从低到高。 例如,10 添加了 2,然后将其乘以 2。 在 DAX 中,有一些函数(例如 CALCULATE)对内部表达式应用筛选器或上下文更改。 在这种情况下,较高优先级会更改较低优先级的表达式。
优先级还确定将哪个动态格式字符串应用于每个度量值的组合 DAX 表达式。 只有优先级最高的计算组的动态格式字符串会被应用。 如果度量值本身具有动态格式字符串,则被视为模型中任何计算组的优先级较低。
具有平均值的优先级示例
让我们看看另一个使用与本文前面所述的时间智能示例相同的模型的示例。 这次,我们还要添加一个平均值计算组。 平均值计算组包含独立于传统时间智能的平均计算,它们不会更改日期筛选器上下文,只是在其中应用平均计算。
在此示例中,定义了每日平均计算。 诸如日均石油桶这样的计算在石油和天然气应用中常见。 其他常见业务示例包括零售店销售平均值。
虽然此类计算独立于时间智能计算进行计算,但很可能需要将它们组合在一起。 例如,用户可能希望查看年初至今的每日石油产量(桶/日),以了解从年初到当前日期的每日石油产量情况。 在此方案中,应为计算项设置优先级。
我们的假设是:
表名称为 平均值。
列名称为 “平均计算”。
优先级为 10。
平均值的计算项
无平均值
SELECTEDMEASURE()
每日平均
DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))
下面是 DAX 查询和返回表的示例:
平均值查询
EVALUATE
CALCULATETABLE (
SUMMARIZECOLUMNS (
DimDate[CalendarYear],
DimDate[EnglishMonthName],
"Sales", CALCULATE (
[Sales],
'Time Intelligence'[Time Calculation] = "Current",
'Averages'[Average Calculation] = "No Average"
),
"YTD", CALCULATE (
[Sales],
'Time Intelligence'[Time Calculation] = "YTD",
'Averages'[Average Calculation] = "No Average"
),
"Daily Average", CALCULATE (
[Sales],
'Time Intelligence'[Time Calculation] = "Current",
'Averages'[Average Calculation] = "Daily Average"
),
"YTD Daily Average", CALCULATE (
[Sales],
'Time Intelligence'[Time Calculation] = "YTD",
'Averages'[Average Calculation] = "Daily Average"
)
),
DimDate[CalendarYear] = 2012
)
平均查询结果返回
下表显示了如何计算 2012 年 3 月的值。
列名称 | 计算 |
---|---|
年初至今 | 2012 年 1 月、2 月销售额总和 = 495,364 + 506,994 + 373,483 |
每日平均 | 2012 年 3 月销售额除以 3 月天数 = 373,483 / 31 |
YTD 每日平均值 | 2012 年 3 月的 YTD 除以 1 月、2 月和 3 月的天数 = 1,375,841 / (31 + 29 + 31) |
下面是以 20 为优先级应用的 YTD 计算项的定义。
CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date]))
下面是每日平均值,其优先级为 10。
DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate))
由于时间智能计算组的优先级高于 Averages 计算组的优先级,因此会尽可能广泛地应用该计算组。 YTD 每日平均值计算适用于年初至今每日平均值计算的分子和分母(天数)。
这等效于以下表达式:
CALCULATE(DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate)), DATESYTD(DimDate[Date]))
不是此表达式:
DIVIDE(CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date])), COUNTROWS(DimDate)))
侧向递归
在上面的时间智能示例中,某些计算项引用同一计算组中的一些计算项。 这称为 侧向递归。 例如, YOY% 引用 YOY 和 PY。
DIVIDE(
CALCULATE(
SELECTEDMEASURE(),
'Time Intelligence'[Time Calculation]="YOY"
),
CALCULATE(
SELECTEDMEASURE(),
'Time Intelligence'[Time Calculation]="PY"
)
)
在这种情况下,这两个表达式都是单独计算的,因为它们使用不同的计算语句。 不支持其他类型的递归。
筛选器上下文中的单个计算项
在我们的时间智能示例中, PY YTD 计算项具有单个计算表达式:
CALCULATE(
SELECTEDMEASURE(),
SAMEPERIODLASTYEAR(DimDate[Date]),
'Time Intelligence'[Time Calculation] = "YTD"
)
CALCULATE() 函数的 YTD 参数可以覆盖筛选上下文,以便重用已在 YTD 计算项中定义的逻辑。 不能在单个评估中同时应用 PY 和 YTD。 仅当计算组中的单个计算项位于筛选器上下文中时,才会 应用 计算组。
订购
默认情况下,当计算组中的列放置在报表中时,计算项按名称按字母顺序排序。 通过指定 Ordinal 属性可以更改报表中出现的计算项的顺序。 使用 Ordinal 属性指定计算项顺序不会更改 优先级,即计算项的计算顺序。 它也不会更改计算项在表格模型资源管理器中显示的顺序。
若要指定计算项的序号属性,必须将第二列添加到计算组。 与数据类型为 Text 的默认列不同,用于排序计算项的第二列具有整数数据类型。 此列的唯一用途是指定计算组中的计算项显示的数字顺序。 由于此列在报表中不提供任何值,因此最好将 Hidden 属性设置为 True。
将第二列添加到计算组后,可以为要排序的计算项指定 Ordinal 属性值。
若要了解详细信息,请参阅 “订购计算项”。
创建计算组
在 Visual Studio 中,使用 Analysis Services Projects 的 VSIX 更新 2.9.2 及更高版本支持计算组。 还可以使用表格模型脚本语言(TMSL)或开源 表格编辑器创建计算组。
使用 Visual Studio 创建计算组
在表格模型资源管理器中,右键单击 “计算组”,然后单击“ 新建计算组”。 默认情况下,新的计算组具有单个列和单个计算项。
使用 “属性” 更改名称并输入计算组、列和默认计算项的说明。
若要为默认计算项输入 DAX 公式表达式,请右键单击,然后单击“ 编辑公式 ”以打开 DAX 编辑器。 输入有效的表达式。
若要添加更多计算项,请右键单击 “计算项”,然后单击“ 新建计算项”。
订购计算项
在表格模型资源管理器中,右键单击计算组,然后单击“ 添加列”。
将列命名为序号(或类似内容),输入说明,然后将 Hidden 属性设置为 True。
对于要排序的每个计算项,请将 Ordinal 属性设置为正数。 每个数字都是顺序的,例如,具有顺序属性为 1 的计算项会最先出现,顺序属性为 2 的计算项会第二个出现,依此类推。 默认 -1 的计算项不包含在排序中,但在报表中的有序项之前显示。
注意事项
将计算组添加到语义模型后,Power BI 报表将对所有度量值使用 变体 数据类型。 如果之后,将从模型中删除所有计算组,度量值将再次返回到其原始数据类型。
局限性
不支持在计算组表上定义的对象级别安全性(OLS)。 但是,可以在同一模型中的其他表上定义 OLS。 如果计算项引用 OLS 保护的对象,则返回泛型错误。
行级别安全性(RLS)不支持。 在同一模型中的表上定义 RLS,但不定义计算组本身(直接或间接)。
计算组不支持详细信息行表达式。
计算组不支持 Power BI 中的智能叙述视觉对象。
使用计算组的模型不支持 Power BI 中的隐式列聚合。 目前,如果 DiscourageImplicitMeasures 属性设置为 false (默认值),则会出现聚合选项,但无法应用它们。 如果 DiscourageImplicitMeasures 设置为 true,则不会显示聚合选项。
使用 LiveConnection 创建 Power BI 报表时,动态格式字符串不会应用于报表级度量值。