共用方式為


計算群組

適用於: 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 ,這表示隱含量值無法與計算群組搭配使用。 表格式物件模型 (TOM) 中可見的新模型屬性已推出,DiscourageImplicitMeasures。 目前,若要建立計算群組,此屬性必須設定為 true true。 當設定為 true 時,Live Connect 模式中的 Power BI Desktop 會停用建立隱含量值。

計算群組也支援多維度數據表達式 (MDX) 查詢。 這表示,Microsoft使用 MDX 查詢表格式數據模型的 Excel 使用者,可以充分利用工作表數據透視表和圖表中的計算群組。

其運作方式

既然您已了解計算群組如何讓使用者受益,讓我們看看如何建立時間智慧計算群組範例。

在我們進入詳細數據之前,讓我們介紹一些專為計算群組而特別的新 DAX 函式:

SELECTEDMEASURE - 由表示式用於計算專案,以參考目前在內容中的量值。 在此範例中,Sales 量值。

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

若要測試此計算群組,請在 SSMS 或開放原始碼 DAX Studio中執行 DAX 查詢。 注意:此查詢範例會省略 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 函式有傳回字串的缺點,強制將數值傳回為字串的量值。 這可能會有一些限制,例如,根據數值而定,無法使用大部分的PowerBI視覺效果,例如圖表。

在 Power BI 中,量值的動態格式字串也允許條件式將格式字串套用至特定量值,而不強制它們傳回字串,而不使用計算群組。 若要深入瞭解,請參閱 量值的動態格式字串

時間智慧的動態格式字串

如果我們查看上述的時間智慧範例,除了 YOY% 以外的所有計算專案都應該在內容中使用目前量值的格式。 例如,在銷售基底量值上計算 YTD 應該是貨幣。 如果這是 Orders 基底量值的計算群組,則格式會是數值。 不過,YOY%,不論基底量值的格式為何,都應該是百分比。

對於 YOY%,我們可以將格式字串表示式屬性設定為 0.00%;-0.00%;0.00%來覆寫格式字串。 若要深入瞭解格式化字串表示式屬性,請參閱 MDX 儲存格屬性 - FORMAT STRING 內容

在此 Power BI 矩陣視覺效果中,您會看到 Sales Current/YOYOrders Current/YOY 保留其各自的基底量值格式字串。 Sales YOY%Orders 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 動態格式字串 表達式。

總而言之,您可以在計算群組上定義下列專案:

...
"calculationGroup": {
  "multipleOrEmptySelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  },
  "noSelectionExpression": {
    "expression": "",
    "formatStringDefinition": {...}
  }
...
}

注意

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

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

選取類型 未定義選取範圍表示式 (預設值) 定義選取表達式
單一選取 已套用選取專案 已套用選取專案
多重選取 未篩選計算群組 傳回評估 multipleOrEmptySelectionExpression 的結果
空白選取範圍 未篩選計算群組 傳回評估 multipleOrEmptySelectionExpression 的結果
無選取範圍 未篩選計算群組 傳回評估 noSelectionExpression 的結果

多重或空白選取

如果在同一個計算群組上有多個選取專案,則如果已定義,計算群組會評估並傳回 multipleOrEmptySelectionExpression 的結果。 如果尚未定義此表示式,計算群組將會傳回下列結果:

SELECTEDMEASURE()

例如,讓我們看看名為 MyCalcGroup 的計算群組,其已設定多個OrEmptySelectionExpression,如下所示:

IF (
ISFILTERED ( 'MyCalcGroup' ),
    "Filters: " 
         & CONCATENATEX ( 
  	            FILTERS ( 'MyCalcGroup'[Name] ),
            'MyCalcGroup'[Name], 
            ", "
     	   )
)

現在,想像下列計算群組上的選取專案:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item1" || 'MyCalcGroup'[Name] = "item2"
    )
}

在這裡,我們會在計算群組 「item1」 和 「item2」 上選取兩個專案。 這是多個選取專案,因此會評估 multipleOrEmptySelectionExpression 並傳回下列結果:“Filters: item1, item2”

接下來,在計算群組上選取下列選項:

EVALUATE
{
    CALCULATE (
        [MyMeasure],
        'MyCalcGroup'[Name] = "item4" -- item4 does not exists
    )
}

這是空白選取範圍的範例,因為此計算群組上不存在 「item4」。。 因此,會評估 multipleOrEmptySelectionExpression 並傳回下列結果:“Filters: ”

無選取範圍

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

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

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

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

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

我們的假設如下:

資料表名稱 平均值
數據行名稱 平均計算
優先權 10

Averages 的計算專案

沒有平均

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
)

平均查詢傳回

Averages 查詢會傳回

下表顯示如何計算 2012 年 3 月的值。

數據行名稱 計算
YTD 2012年1月、2月、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)

以下是 YTD 計算項目的定義,其優先順序為 20

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 的預設數據行,用於排序計算專案的第二個數據行具有整數數據類型。 此數據行的唯一用途是指定計算群組中計算項目出現的數字順序。 由於此數據行在報表中沒有提供任何值,因此最好將 [隱藏] 屬性設定為 True。

排序 的 數據行

將第二個數據行新增至計算群組之後,您可以針對您想要排序的計算專案指定 Ordinal 屬性值。

Ordinal 屬性

若要深入瞭解,請參閱 排序計算專案

建立計算群組

Visual Studio 支持計算群組與 Analysis Services 專案 VSIX 更新 2.9.2 和更新版本。 您也可以使用表格式模型文本語言 (TMSL) 或開放原始碼 表格式編輯器來建立計算群組。

使用 Visual Studio 建立計算群組

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

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

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

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

排序計算專案

  1. 在 [表格式模型總管] 中,以滑鼠右鍵按兩下計算群組,然後按兩下 [[新增資料行]

  2. 將數據行命名為 Ordinal (或類似專案),輸入描述,然後將 [隱藏] 屬性設定為 True

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

局限性

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

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

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

Power BI 中的智慧型手機 視覺效果不支援計算群組。

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

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

另請參閱

表格式模型中的DAX
DAX 參考