共用方式為


計算群組

適用於: SQL Server 2019 及更新版本的 Analysis Services Azure Analysis Services Fabric/Power BI Premium

計算群組可藉由將常見量值運算式分組為「計算項目」 來大幅減少多餘量值的數目。 在 1500 和更高 相容性層級的表格式模型中支援計算群組。

好處

計算群組解決複雜模型中的問題,其中可能會使用相同的計算來擴散備援量值,最常見的是時間智能計算。 例如,銷售分析師想要查看每月至今(MTD)、季度至今(QTD)、年度截至目前(YTD)、上一年度的訂單(PY)的銷售總額和訂單等等。 數據模型化工具必須為每個計算建立個別量值,這可能會導致數十個量值。 對於用戶來說,這可能表示必須排序同樣多的量值,並將它們個別套用至報表。

讓我們先看看計算群組在Power BI等報表工具中向用戶顯示的方式。 然後,我們將探討組成計算群組的內容,以及如何在模型中建立計算群組。

計算群集合會顯示在報表用戶端中,作為具有單一欄位的表格。 此欄位不同於一般的欄位或維度,它代表的是一個或多個可重複使用的計算項目,或量值計算專案,可以套用至任何已新增至視覺化中 Values 篩選的量度。

在下列動畫中,使用者正在分析 2012 年和 2013 年的銷售數據。 套用計算群組之前,常見的基底量值 Sales 會計算每個月的總銷售額總和。 然後,使用者想要套用時間智能計算,以取得月份到日期、季度到日期、日期到日期等的銷售總計。 如果沒有計算群組,用戶必須選取個別的時間智慧量值。

使用計算群組時,在此範例中,名為 Time Intelligence,當使用者將 時間計算 專案拖曳至 [數據 行] 篩選 區域時,每個計算專案都會顯示為個別的數據行。 每個數據列的值都是從基底量值 Sales 計算而來。

正在 Power BI 中套用的計算群組

計算群組會使用 明確的 DAX量值。 在此範例中, Sales 是已在模型中建立的明確量值。 計算群組不支援隱式 DAX 量值。 例如,當使用者將數據行拖曳到視覺效果以檢視匯總值時,就會在Power BI 中建立隱含量值,而不需要建立明確的量值。 目前,Power BI 會針對作為內嵌 DAX 計算的隱含度量值產生 DAX,這表示隱含度量值無法與計算群組搭配使用。 已在 Tabular Object Model (TOM) 中推出一個名為 DiscourageImplicitMeasures 的新模型屬性。 目前,若要建立計算群組,這個屬性必須設定為 true。 當設定為 true 時,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/YOYOrders 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 量值的動態格式貨幣轉換。

套用貨幣轉換動態格式字串

選取表達式

選取表達式是針對計算群組定義的選擇性屬性。 選取表示式有兩種類型:

這兩個選取表達式也有 formatStringDefinition 動態格式字串 表達式。

總而言之,您可以在計算群組上定義以下內容,例如使用 TMDL:

...
table Scenarios
	calculationGroup
		...
    multipleOrEmptySelectionExpression = <expression>
        formatStringDefinition = <format string>
    noSelectionExpression= <expression>
        formatStringDefinition = <format string>
...

注意

如果指定,這些表示式只會套用到所述的特定情況。 單獨的計算項目的選擇不會受到這些表達式的影響。

以下是這些表達式及其預設行為的概觀,如果未指定:

選取類型 未定義選擇表達式(預設值) 定義選取表達式
單一選取 已套用選取 已套用選取
多重選取 未被篩選的計算群組 傳回對 multipleOrEmptySelectionExpression 進行評估的結果
空的選擇 未被篩選的計算群組 傳回對 multipleOrEmptySelectionExpression 進行評估的結果
沒有選取 未被篩選的計算群組 傳回評估 noSelectionExpression 的結果

注意

使用 模型的 selectionExpressionBehavior 設定,進一步影響未定義選取表達式時計算群組傳回的內容。

SelectionExpressionBehavior 模型設定

模型具有 selectionExpressionBehavior 設定,可進一步控制該模型中計算群組的行為。 這個設定接受下列三個值:

  • 自動: 這是預設值,與 非視覺 相同。 這可確保現有的模型不會變更行為。 未來相容性層級設定為自動的模型將會改用 視覺。 屆時將有公告。
  • 非視覺。 如果計算群組未定義 multipleOrEmptySelection 表達式,則計算群組會傳回SELECTEDMEASURE(),並在依計算群組進行分組時隱藏小計值。
  • 視覺。 如果計算群組未定義 multipleOrEmptySelection 運算式,計算群組會傳 BLANK()回 。 依計算群組分組時,小計值會藉由評估計算群組內容中的選取量值來決定。

使用 TMDL 在您的模型上設定 屬性:

createOrReplace
    model Model
        ...
        selectionExpressionBehavior: <automatic|nonvisual|visual>
...

多重或空白選取

如果在同一個計算群組上有多個選取項目,如果有定義,計算群組會評估 multipleOrEmptySelectionExpression 並傳回其結果。 如果此表達式尚未被定義,且模型的 selectionExpressionBehavior 設定 為自動或非可視,則計算組將傳回下列結果:

SELECTEDMEASURE()

如果模型的 selectionExpressionBehavior 設定 設為 視覺效果,則計算群組會傳回:

BLANK()

例如,我們來看看名為 MyCalcGroup 的計算群組,其已設定 multipleOrEmptySelectionExpression,如下所示:

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] ) )
        )
    )
)

我們也會為此表達式設置格式字串定義:

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 表達式。 優先順序最高的計算群組動態格式字串是唯一套用的字串。 如果量值本身具有動態格式字串,則會被視為模型中任何計算群組的優先順序較低。

具有平均值的優先順序範例

讓我們看看另一個使用相同模型的範例,如本文稍早所述的時間智慧範例所示。 但這次,我們也會新增 Averages 計算群組。 Averages 計算群組包含與傳統時間智慧無關的平均計算,因為它們不會變更日期篩選內容,而只會在其中套用平均計算。

在此範例中,會定義每日平均計算。 在石油和天然氣應用領域中常見的計算,例如平均每天石油桶數。 其他常見的商務範例包括零售商店銷售平均值。

雖然這類計算與時間智慧計算無關,但很可能需要結合這些計算。 例如,使用者可能想要查看年初到目前日期的每日石油桶數,以檢視每日油價。 在此案例中,應為計算專案設定優先順序。

我們的假設如下:

數據表名稱為 Averages
數據行名稱為 [平均計算]。
優先順序為 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 月的值。

欄位名稱 計算
YTD 2012年1月、2月、3月的銷售總和
= 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))

由於 Time Intelligence 計算群組的優先順序高於 Averages 計算群組的優先順序,因此會盡可能廣泛地套用。 YTD 每日平均計算會將 YTD 同時套用在計算每日平均的分子和分母(即天數計算)上。

這相當於下列表示式:

CALCULATE(DIVIDE(SELECTEDMEASURE(), COUNTROWS(DimDate)), DATESYTD(DimDate[Date]))

不是此表示式:

DIVIDE(CALCULATE(SELECTEDMEASURE(), DATESYTD(DimDate[Date])), COUNTROWS(DimDate)))

橫向遞歸

在上述時間智慧範例中,某些計算項目會參考相同計算群組中的其他專案。 這稱為 側向遞歸。 例如, YOY% 參考 YOYPY

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 專案 VSIX 更新 2.9.2 起至更新版本支持計算群組。 您也可以使用表格式模型文本語言 (TMSL) 或開放原始碼 表格式編輯器來建立計算群組。

使用 Visual Studio 建立計算群組

  1. 在 [表格式模型總管] 中,以滑鼠右鍵按兩下 [計算群組],然後按兩下 [ 新增計算群組]。 根據預設,新的計算群組具有單一數據行和單一計算專案。

  2. 使用 [屬性 ] 來變更名稱,並輸入計算群組、數據行和預設計算專案的描述。

  3. 若要輸入預設計算專案的 DAX 公式表示式,請以滑鼠右鍵按兩下 ,然後按兩下 [ 編輯公式 ] 以開啟 DAX 編輯器。 輸入有效的表達式。

  4. 若要新增更多計算專案,請以滑鼠右鍵按兩下 [計算專案],然後按兩下[ 新增計算專案]。

整理計算項目

  1. 在 [表格式模型總管] 中,以滑鼠右鍵按一下計算群組,然後按一下 [新增欄位]。

  2. 將欄位命名為序數(或其他類似名稱),輸入描述,然後將 Hidden 屬性設定為 True。

  3. 針對您想要排序的每個計算專案,將 Ordinal 屬性設定為正數。 例如,每個數字都是按照順序的,具有序數屬性1的計算項目會首先出現,具有序數屬性2的則會顯示在第二個,依此類推。 具有預設 -1 的計算專案不會包含在排序中,而是出現在報表中已排序的專案之前。

考慮事項

一旦將計算群組新增至語意模型,Power BI 報表就會對所有量值使用 Variant 數據類型。 如果之後,所有計算群組都會從模型中移除,量值會再次傳回其原始數據類型。

局限性

不支援計算群組數據表上定義的物件層級安全性 (OLS)。 不過,可以在相同模型中的其他數據表上定義 OLS。 如果計算項目參考 OLS 安全物件,則會傳回泛型錯誤。

不支援列級別安全性 (RLS)。 在相同模型中的數據表上定義 RLS,但不定義計算群組本身(直接或間接)。

計算群組不支援詳細數據列表達式

Power BI 中的智慧敘述視覺效果不支援計算群組。

對於具有計算群組的模型,Power BI 不支援隱含欄位匯總。 目前,如果 DiscourageImplicitMeasures 屬性設定為 false (預設值),匯總選項就會顯示,但無法套用它們。 如果 DiscourageImplicitMeasures 設定為 true,則不會顯示匯總選項。

使用 LiveConnection 建立 Power BI 報表時,動態格式字串不會套用至報表層級量值。

另請參閱

表格式模型中的DAX
DAX 參考