계산 그룹

적용 대상: SQL Server 2019 이상 Analysis Services Azure Analysis Services Fabric/Power BI Premium

계산 그룹은계산 항목으로 일반적인 측정값 식을 그룹화하여 중복 측정값 수를 크게 줄일 수 있습니다. 계산 그룹은 1500 이상의 호환성 수준에서 테이블 형식 모델에서 지원됩니다.

이점

계산 그룹은 시간 인텔리전스 계산에서 가장 일반적인 동일한 계산을 사용하여 중복 측정값이 확산될 수 있는 복잡한 모델의 문제를 해결합니다. 예를 들어 판매 분석가는 MTD(월-날짜), QTD(분기-날짜), YTD(연도별), 전년 동기(PY) 주문 등을 기준으로 판매 합계 및 주문을 확인하려고 합니다. 데이터 모델러는 각 계산에 대해 별도의 측정값을 만들어야 하며, 이로 인해 수십 개의 측정값이 발생할 수 있습니다. 사용자의 경우 측정값을 최대한 많이 정렬하고 보고서에 개별적으로 적용해야 할 수 있습니다.

먼저 Power BI와 같은 보고 도구에서 계산 그룹이 사용자에게 표시되는 방식을 살펴보겠습니다. 그런 다음 계산 그룹을 구성하는 항목과 모델에서 계산 그룹을 만드는 방법을 살펴보겠습니다.

계산 그룹은 보고하는 클라이언트에 단일 열이 있는 테이블로 표시됩니다. 열은 일반적인 열이나 차원과는 다릅니다. 대신 하나 이상의 재사용 가능한 계산 또는 시각화를 위해 값 필터에 이미 추가된 측정값에 적용할 수 있는 계산 항목을 나타냅니다.

다음 애니메이션에서 사용자는 2012년과 2013년 동안의 판매 데이터를 분석합니다. 계산 그룹을 적용하기 전에 공통 기본 측정값 Sales 는 매월 총 판매액의 합계를 계산합니다. 그런 다음, 사용자는 시간 인텔리전스 계산을 적용하여 월별, 분기별 날짜, 연도별 총액 등을 구하려고 합니다. 계산 그룹이 없으면 사용자는 개별 시간 인텔리전스 측정값을 선택해야 합니다.

이 예제에서는 Time Intelligence라는 계산 그룹을 사용하여 시간 계산 항목을 필터 영역으로 끌면 각 계산 항목이 별도의 열로 표시됩니다. 각 행의 값은 기본 측정값인 Sales에서 계산 됩니다.

Power BI에 적용되는 계산 그룹

계산 그룹은 명시적 DAX 측정값으로 작동합니다. 이 예제에서 Sales 는 모델에서 이미 만든 명시적 측정값입니다. 계산 그룹은 암시적 DAX 측정값에서 작동하지 않습니다. 예를 들어 Power BI 암시적 측정값은 사용자가 명시적 측정값을 만들지 않고 집계된 값을 보기 위해 열을 시각적 개체로 끌 때 만들어집니다. 현재 Power BI는 인라인 DAX 계산으로 작성된 암시적 측정값에 대한 DAX를 생성합니다. 즉, 암시적 측정값이 계산 그룹에서 작동할 수 없습니다. TOM(테이블 형식 개체 모델)에 표시되는 새 모델 속성인 DiscourageImplicitMeasures가 도입되었습니다. 현재 계산 그룹을 만들려면 이 속성을 true로 설정해야 합니다. true로 설정하면 Live Connect 모드의 Power BI Desktop 암시적 측정값 생성을 사용하지 않도록 설정합니다.

계산 그룹은 MDX(다차원 데이터 식) 쿼리도 지원합니다. 즉, MDX를 사용하여 테이블 형식 데이터 모델을 쿼리하는 Microsoft Excel 사용자는 워크시트 피벗 테이블 및 차트의 계산 그룹을 최대한 활용할 수 있습니다.

작동 방식

이제 계산 그룹이 사용자에게 어떻게 도움이 되는지 살펴보았으므로 표시된 시간 인텔리전스 계산 그룹 예제를 만드는 방법을 살펴보겠습니다.

세부 정보로 이동하기 전에 계산 그룹에 대한 몇 가지 새로운 DAX 함수를 소개해 보겠습니다.

SELECTEDMEASURE - 계산 항목에 대한 식에서 현재 컨텍스트에 있는 측정값을 참조하는 데 사용됩니다. 이 예제에서는 Sales 측정값입니다.

SELECTEDMEASURENAME - 계산 항목에 대한 식에서 이름으로 컨텍스트에 있는 측정값을 결정하는 데 사용됩니다.

ISSELECTEDMEASURE - 계산 항목에 대한 식에서 컨텍스트에 있는 측정값이 측정값 목록에 지정되어 있는지 확인하는 데 사용됩니다.

SELECTEDMEASUREFORMATSTRING - 계산 항목에 대한 식에서 컨텍스트에 있는 측정값의 형식 문자열을 검색하는 데 사용됩니다.

시간 인텔리전스 예제

테이블 이름 - 시간 인텔리전스
열 이름 - 시간 계산
우선 순위 - 20

시간 인텔리전스 계산 항목

Current

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

대비

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 함수는 문자열을 반환하는 단점이 있으므로 숫자인 측정값도 문자열로 반환됩니다. 여기에는 차트와 같은 숫자 값에 따라 대부분의 Power BI 시각적 개체에서 작동하지 않는 것과 같은 몇 가지 제한 사항이 있을 수 있습니다.

Power BI에서 측정값에 대한 동적 서식 문자열을 사용하면 계산 그룹을 사용하지 않고 문자열을 강제로 반환하지 않고 특정 측정값에 형식 문자열을 조건부로 적용할 수도 있습니다. 자세한 내용은 측정값에 대한 동적 형식 문자열을 참조하세요.

시간 인텔리전스에 대한 동적 형식 문자열

위에 표시된 Time Intelligence 예제를 살펴보면 YOY%를 제외한 모든 계산 항목은 컨텍스트에서 현재 측정값의 형식을 사용해야 합니다. 예를 들어 Sales 기본 측정값에서 계산된 YTD 는 통화여야 합니다. Orders 기본 측정값과 같은 계산 그룹인 경우 형식은 숫자입니다. 그러나 YOY%는 기본 측정값의 형식에 관계없이 백분율이어야 합니다.

YOY%의 경우 형식 문자열 식 속성을 0.00%;-0.00%로 설정하여 형식 문자열을 재정의할 수 있습니다. 0.00%. 문자열 식 속성 서식에 대한 자세한 내용은 MDX 셀 속성 - FORMAT STRING Contents를 참조하세요.

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

예를 들어 다음과 같이 multipleOrEmptySelectionExpression이 구성된 MyCalcGroup이라는 계산 그룹을 살펴보겠습니다.

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인 것을 볼 수 있습니다.

SSMS(SQL Server Management Studio) 또는 오픈 소스 테이블 형식 편집기 같은 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 식에 적용되는 동적 형식 문자열도 결정합니다. 가장 높은 우선 순위 계산 그룹 동적 서식 문자열만 적용됩니다. 측정값 자체에 동적 형식 문자열이 있는 경우 모델의 계산 그룹에 대한 우선 순위가 낮은 것으로 간주됩니다.

평균 예제의 우선 순위

이 문서의 앞부분에서 설명한 시간 인텔리전스 예제와 동일한 모델을 사용하는 다른 예제를 살펴보겠습니다. 하지만 이번에는 평균 계산 그룹도 추가해 보겠습니다. 평균 계산 그룹에는 날짜 필터 컨텍스트를 변경하지 않는다는 측면에서 기존 시간 인텔리전스와 독립적인 평균 계산이 포함되어 있으며, 그 안에 평균 계산만 적용됩니다.

이 예제에서는 일별 평균 계산이 정의됩니다. 일일 평균 석유 배럴과 같은 계산은 석유 및 가스 애플리케이션에서 일반적입니다. 기타 일반적인 비즈니스 예로는 소매점의 매장 판매 평균이 포함됩니다.

이러한 계산은 시간 인텔리전스 계산과 독립적으로 계산되지만 결합해야 할 요구 사항이 있을 수 있습니다. 예를 들어 사용자는 연초부터 현재 날짜까지 일일 석유 비율을 보기 위해 일일 석유 배럴 YTD를 보고 싶을 수 있습니다. 이 시나리오에서는 계산 항목에 우선 순위를 설정해야 합니다.

가정은 다음과 같습니다.

테이블 이름은 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월 판매액 합계
= 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))

시간 인텔리전스 계산 그룹의 우선 순위가 평균 계산 그룹의 우선 순위보다 높기 때문에 가능한 한 광범위하게 적용됩니다. 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"
    )
)

이 경우 두 식은 서로 다른 calculate 문을 사용하므로 별도로 평가됩니다. 다른 유형의 재귀는 지원되지 않습니다.

필터 컨텍스트의 단일 계산 항목

시간 인텔리전스 예제에서 PY YTD 계산 항목에는 단일 계산 식이 있습니다.

CALCULATE(
    SELECTEDMEASURE(),
    SAMEPERIODLASTYEAR(DimDate[Date]),
    'Time Intelligence'[Time Calculation] = "YTD"
)

CALCULATE() 함수에 대한 YTD 인수는 필터 컨텍스트를 재정의하여 YTD 계산 항목에 이미 정의된 논리를 다시 사용합니다. 단일 평가에서는 PY와 YTD를 모두 적용할 수 없습니다. 계산 그룹은 계산 그룹의 단일 계산 항목이 필터 컨텍스트에 있는 경우에만 적용 됩니다.

순서 지정

기본적으로 계산 그룹의 열이 보고서에 배치되면 계산 항목은 이름별로 사전순으로 정렬됩니다. 서수 속성을 지정하여 계산 항목이 보고서에 표시되는 순서를 변경할 수 있습니다. 서수 속성을 사용하여 계산 항목 순서를 지정해도 계산 항목이 평가되는 순서의 우선 순위는 변경되지 않습니다. 또한 테이블 형식 모델 Explorer 계산 항목이 표시되는 순서는 변경되지 않습니다.

계산 항목의 서수 속성을 지정하려면 계산 그룹에 두 번째 열을 추가해야 합니다. 데이터 형식이 Text인 기본 열과 달리 계산 항목 순서 지정에 사용되는 두 번째 열에는 정수 데이터 형식이 있습니다. 이 열의 유일한 목적은 계산 그룹의 계산 항목이 표시되는 숫자 순서를 지정하는 것입니다. 이 열은 보고서에 값을 제공하지 않으므로 Hidden 속성을 True로 설정하는 것이 가장 좋습니다.

순서 지정을 위한 열

계산 그룹에 두 번째 열을 추가한 후 정렬하려는 계산 항목에 대한 서수 속성 값을 지정할 수 있습니다.

서수 속성

자세한 내용은 계산 항목 순서 지정을 참조하세요.

계산 그룹 만들기

계산 그룹은 Analysis Services 프로젝트 VSIX 업데이트 2.9.2 이상을 사용하여 Visual Studio에서 지원됩니다. TMSL(테이블 형식 모델 스크립팅 언어) 또는 오픈 소스 테이블 형식 편집기 사용하여 계산 그룹을 만들 수도 있습니다.

Visual Studio를 사용하여 계산 그룹을 만들려면

  1. 테이블 형식 모델 Explorer 계산 그룹을 마우스 오른쪽 단추로 클릭한 다음 새 계산 그룹을 클릭합니다. 기본적으로 새 계산 그룹에는 단일 열과 단일 계산 항목이 있습니다.

  2. 속성을 사용하여 이름을 변경하고 계산 그룹, 열 및 기본 계산 항목에 대한 설명을 입력합니다.

  3. 기본 계산 항목에 대한 DAX 수식 식을 입력하려면 마우스 오른쪽 단추를 클릭한 다음 수식 편집을 클릭하여 DAX 편집기 엽니다. 유효한 식을 입력합니다.

  4. 계산 항목을 더 추가하려면 계산 항목을 마우스 오른쪽 단추로 클릭한 다음 새 계산 항목을 클릭합니다.

계산 항목을 정렬하려면

  1. 테이블 형식 모델 Explorer 계산 그룹을 마우스 오른쪽 단추로 클릭한 다음 열 추가를 클릭합니다.

  2. 열 이름을 서수(또는 이와 유사한 항목)로 지정하고 설명을 입력한 다음 Hidden 속성을 True로 설정합니다.

  3. 정렬하려는 각 계산 항목에 대해 서수 속성을 양수로 설정합니다. 예를 들어 서수 속성이 1인 계산 항목이 먼저 나타나고 속성이 2인 계산 항목이 두 번째로 나타나는 등의 순차적 숫자입니다. 기본값이 -1인 계산 항목은 순서 지정에 포함되지 않지만 보고서의 정렬된 항목 앞에 표시됩니다.

제한 사항

계산 그룹 테이블에 정의된 OLS(개체 수준 보안)는 지원되지 않습니다. 그러나 OLS는 동일한 모델의 다른 테이블에 정의할 수 있습니다. 계산 항목이 OLS 보안 개체를 참조하는 경우 제네릭 오류가 반환됩니다.

RLS(행 수준 보안)는 지원되지 않습니다. 계산 그룹 자체(직접 또는 간접적)가 아닌 동일한 모델의 테이블에 대해 RLS를 정의합니다.

세부 정보 행 식은 계산 그룹에서 지원되지 않습니다.

Power BI의 스마트 설명 시각적 개체는 계산 그룹에서 지원되지 않습니다.

Power BI의 암시적 열 집계는 계산 그룹이 있는 모델에 대해 지원되지 않습니다. 현재 DiscourageImplicitMeasures 속성이 false (기본값)로 설정된 경우 집계 옵션이 표시되지만 적용할 수는 없습니다. DiscourageImplicitMeasurestrue로 설정된 경우 집계 옵션이 표시되지 않습니다.

LiveConnection을 사용하여 Power BI 보고서를 만들 때 동적 형식 문자열은 보고서 수준 측정값에 적용되지 않습니다.

추가 정보

테이블 형식 모델의 DAX
DAX 참조