다음을 통해 공유


SUMMARIZECOLUMNS

적용 대상: 계산 열 계산 테이블 측정 시각적 계산

그룹 집합에 대한 요약 테이블을 반환합니다.

구문

SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)  

매개 변수

용어 정의
groupBy_columnName 반환된 테이블에 고유 값이 포함된 기본 테이블에 대한 정규화된 열 참조(Table[Column])입니다. 각 groupBy_columnName 열은 다음에 지정된 열과 교차 조인(서로 다른 테이블) 또는 자동 존재(동일한 테이블)입니다.
filterTable groupBy_columnName 인수로 지정된 모든 열의 필터 컨텍스트에 추가되는 테이블 식입니다. 필터 테이블에 있는 값은 교차 조인/자동 존재가 수행되기 전에 필터링하는 데 사용됩니다.
name 지정된 후속 식에 사용할 열 이름을 나타내는 문자열입니다.
테이블이 아닌 단일 값을 반환하는 DAX 식입니다.

반환 값

지정된 그룹화에 따라 제공된 열의 값 조합이 포함된 테이블입니다. 제공된 식 중 하나 이상이 비어있지 않은 값을 반환하는 행만 반환되는 테이블에 포함됩니다. 모든 식이 행에 대해 BLANK/NULL로 평가되는 경우 해당 행은 반환되는 테이블에 포함되지 않습니다.

설명

  • 이 함수는 결과에 대한 정렬 순서를 보장하지 않습니다.

  • groupBy_columnName 매개 변수에서 열을 두 번 이상 지정할 수 없습니다. 예를 들어 다음 수식이 잘못되었습니다.

    SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )

  • 이 함수는 계산 열 또는 RLS(행 수준 보안) 규칙에서 사용되는 경우 DirectQuery 모드에서 사용할 수 없습니다.

필터 컨텍스트

다음과 같은 쿼리를 고려해 보세요.

SUMMARIZECOLUMNS ( 
    'Sales Territory'[Category], 
    FILTER('Customer', 'Customer' [First Name] = "Alicia") 
)

이 쿼리에서 측정값이 없으면 groupBy 열에는 FILTER 식의 열(예: Customer 테이블)이 포함되지 않습니다. groupBy 열에는 필터가 적용되지 않습니다. Sales Territory 및 Customer 테이블은 재판매인 판매 팩트 테이블을 통해 간접적으로 관련될 수 있습니다. 직접 관련이 없으므로 필터 식은 no-op이며 groupBy 열은 영향을 받지 않습니다.

그러나 이 쿼리를 사용하면 다음을 수행합니다.

SUMMARIZECOLUMNS ( 
    'Sales Territory'[Category], 'Customer' [Education], 
    FILTER('Customer', 'Customer'[First Name] = "Alicia") 
)

groupBy 열에는 필터의 영향을 받는 열이 포함되어 있으며 해당 필터는 groupBy 결과에 적용됩니다.

IGNORE 포함

IGNORE 구문을 사용하여 BLANK/NULL 계산에서 특정 식을 생략하여 SUMMARIZECOLUMNS 함수의 동작을 수정할 수 있습니다. IGNORE를 사용하지 않는 모든 식이 BLANK/NULL을 반환하는 행은 IGNORE를 사용하는 식이 BLANK/NULL로 평가되는지 여부에 관계없이 제외됩니다. IGNORE 는 SUMMARIZECOLUMNS 식 내에서만 사용할 수 있습니다.

예시

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Total Qty", 
    IGNORE( SUM( Sales[Qty] ) ), 
    "BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 ) 
)

그러면 Sales[CustomerId] 열이 롤업되어 지정된 그룹화의 모든 고객에 대한 부분합이 생성됩니다. IGNORE가 없으면 결과는 다음과 같습니다.

고객 ID 총 Qty BlankIfTotalQtyIsNot3
A 5
b 3 3
C 3 3

IGNORE를 사용하여

고객 ID 총 Qty BlankIfTotalQtyIsNot3
B 3 3
C 3 3

모든 식이 무시됨,

SUMMARIZECOLUMNS( 
    Sales[CustomerId], "Blank", 
    IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5", 
    IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) ) 
)

두 식이 일부 행에 대해 공백으로 반환되더라도 공백을 반환하는 서명되지 않은 식이 없으므로 포함됩니다.

고객 ID 빈 템플릿 BlankIfTotalQtyIsNot5
A 5
b
C

NONVISUAL을 사용하는 경우

NONVISUAL 함수는 SUMMARIZECOLUMNS 함수의 값 필터를 측정값에 영향을 주지 않고 groupBy 열에만 적용하는 것으로 표시합니다. NONVISUAL 은 SUMMARIZECOLUMNS 식 내에서만 사용할 수 있습니다.

예시

DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
    DimDate[CalendarYear],
    NONVISUAL(TREATAS({2007, 2008}, DimDate[CalendarYear])),
    "Sales", [Sales],
    "Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]

[Visual Total Sales]가 모든 연도의 합계인 결과를 반환합니다.

DimDate[CalendarYear] [Sales] [Visual Total Sales]
2007 9,791,060.30 29,358,677.22
2008 9,770,899.74 29,358,677.22

반면 NONVISUAL 함수가 없는 동일한 쿼리는 다음과 같습니다.

DEFINE
MEASURE FactInternetSales[Sales] = SUM(FactInternetSales[Sales Amount])
EVALUATE
SUMMARIZECOLUMNS
(
    DimDate[CalendarYear],
    TREATAS({2007, 2008}, DimDate[CalendarYear]),
    "Sales", [Sales],
    "Visual Total Sales", CALCULATE([Sales], ALLSELECTED(DimDate[CalendarYear]))
)
ORDER BY [CalendarYear]

[Visual Total Sales]가 선택한 2년 동안의 합계인 결과를 반환합니다.

DimDate[CalendarYear] [Sales] [Visual Total Sales]
2007 9,791,060.30 19,561,960.04
2008 9,770,899.74 19,561,960.04

ROLLUPADDISSUBTOTAL 사용

ROLLUPADDISSUBTOTAL 구문을 추가하면 groupBy_columnName 열을 기반으로 롤업/부분합 행을 결과에 추가하여 SUMMARIZECOLUMNS 함수의 동작을 수정합니다. ROLLUPADDISSUBTOTAL 은 SUMMARIZECOLUMNS 식 내에서만 사용할 수 있습니다.

단일 부분합을 사용하는 예제

DEFINE
VAR vCategoryFilter =
  TREATAS({"Accessories", "Clothing"}, Product[Category])
VAR vSubcategoryFilter = 
  TREATAS({"Bike Racks", "Mountain Bikes"}, Product[Subcategory])
EVALUATE
  SUMMARIZECOLUMNS
  (
    ROLLUPADDISSUBTOTAL
    (
      Product[Category], "IsCategorySubtotal", vCategoryFilter,
      Product[Subcategory], "IsSubcategorySubtotal", vSubcategoryFilter
    ),
    "Total Qty", SUM(Sales[Qty])
  )
  ORDER BY
  [IsCategorySubtotal] DESC, [Category],
  [IsSubcategorySubtotal] DESC, [Subcategory]

다음 표를 반환합니다.

범주 하위 범주 IsCategorySubtotal IsSubcategorySubtotal 총 Qty
True True 60398
Accessories False True 36092
Accessories 자전거 랙 False False 328
Bikes 산악용 자전거 False False 4970
의복 False True 9101

여러 부분합이 있는 예제

SUMMARIZECOLUMNS ( 
    Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ), 
    ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] ) 
)

판매는 주별, 고객별, 날짜별, 1에 대한 부분합으로 그룹화됩니다. 주별 판매액(날짜 2 기준)입니다. 주별 판매액( 고객 3 기준) 고객 및 날짜 모두에 롤업되어 주별 판매로 이어집니다.

다음 표를 반환합니다.

CustomerID IsCustomerSubtotal State(상태) 총 Qty 날짜 IsDateSubtotal
A FALSE WA 5 2014/7/10
B FALSE WA 1 2014/7/10
B FALSE WA 2 7/11/2014
C FALSE 또는 2 2014/7/10
C FALSE 또는 1 7/11/2014
TRUE WA 6 2014/7/10
TRUE WA 2 7/11/2014
TRUE 또는 2 2014/7/10
TRUE 또는 1 7/11/2014
A FALSE WA 5 TRUE
B FALSE WA 3 TRUE
C FALSE 또는 3 TRUE
TRUE WA 8 TRUE
TRUE 또는 3 TRUE

ROLLUPGROUP 사용

SUMMARIZE 함수와 마찬가지로 ROLLUPGROUP을 ROLLUPADDISSUBTOTAL함께 사용하여 포함할 요약 그룹/세분성(부분합)을 지정하여 반환되는 부분합 행 수를 줄일 수 있습니다. ROLLUPGROUP 은 SUMMARIZECOLUMNS 또는 SUMMARIZE 식 내에서만 사용할 수 있습니다.

여러 부분합이 있는 예제

SUMMARIZECOLUMNS( 
    ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ), 
    ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] ) 
)

여전히 도시 및 주별로 그룹화되지만 부분합을 보고할 때 함께 압연되면 다음 표가 반환됩니다.

State(상태) 고객 ID IsCustomerSubtotal 총 Qty City IsCityStateSubtotal
WA A FALSE 2 Bellevue FALSE
WA B FALSE 2 Bellevue FALSE
WA A FALSE 3 Redmond FALSE
WA B FALSE 1 Redmond FALSE
또는 C FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Redmond FALSE
또는 TRUE 3 Portland FALSE
A FALSE 5 FALSE
B FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

Contextual SummarizeColumns

배경

2023년 2월까지 SUMMARIZECOLUMNS는 컨텍스트 전환 내에서 평가를 전혀 지원하지 않았습니다. 해당 달 이전에 릴리스된 제품에서 이 제한으로 인해 SUMMARIZECOLUMNS는 대부분의 측정값에서 유용하지 않습니다. 다른 SUMMARIZECOLUMNS 문을 비롯한 컨텍스트 전환의 경우 SUMMARIZECOLUMNS 측정값을 호출할 수 없었습니다.

2023년 2월부터 컨텍스트 전환은 일부 시나리오에서 지원되었지만 일부 조건에서는 지원되지 않았습니다. 지원되고 제한된 사례는 다음과 같습니다.

SummarizeColumns 형식 단일 열이 있는 외부 필터 열이 두 개 이상 있는 외부 필터 외부 GroupBy 열
GroupBy만 있는 SummarizeColumns 확인 확인 확인
Filters/Measures를 사용하는 SummarizeColumns 확인 오류 오류

2024년 6월부터 모든 컨텍스트 전환에서 SummarizeColumns를 평가할 수 있는 Contextual SummarizeColumns를 사용하도록 설정하고 있습니다. 이제 측정값의 SummarizeColumns가 완전히 지원됩니다.

SummarizeColumns 형식 단일 열이 있는 외부 필터 열이 두 개 이상 있는 외부 필터 외부 GroupBy 열
GroupBy만 있는 SummarizeColumns 확인 확인 확인
Filters/Measures를 사용하는 SummarizeColumns 확인 확인 확인

그러나 이 업데이트에는 SummarizeColumns의 동작이 변경되어 기존 식의 결과가 변경됩니다.

외부 필터에 대한 SelfValue 의미 체계

외부 테이블의 필터가 SummarizeColumns의 GroupBy 열과 상호 작용하는 방식을 변경하는 SelfValue라는 의미 체계 개념을 소개합니다. 이렇게 변경하면 테이블이 필터별 관계를 통해 관련되어 있더라도 다른 테이블의 필터가 GroupBy 열에 영향을 줄 수 없습니다. 이 변경의 영향을 보여 주는 예제에는 다음 식이 포함됩니다.

CalculateTable(
  SummarizeColumns(
      'Reseller Sales'[ResellerKey], 
      'Reseller Sales'[ProductKey]
  ), 
  Treatas({(229)}, 'Product'[Product Key])
)

이 업데이트 전에 TreatAs 필터는 'Product'[Product Key]와 'Reseller Sales'[ProductKey] 간의 관계를 활용하여 SummarizeColumns 내의 GroupBy 작업에 적용됩니다. 따라서 쿼리 결과에는 'Reseller Sales'[ProductKey]가 229인 행만 포함됩니다. 그러나 업데이트 후 SummarizeColumns 내의 GroupBy 열은 외부 테이블 간에 관계가 있더라도 더 이상 외부 테이블의 열로 필터링되지 않습니다. 따라서 위의 예제에서 GroupBy 열 'Reseller Sales'[ProductKey]는 'Product'[ProductKey] 열로 필터링되지 않습니다. 결과적으로 쿼리에는 'Reseller Sales'[ProductKey]가 229와 같지 않은 행이 포함됩니다.

이전 동작을 유지하려는 경우 아래와 같이 SummarizeColumns 대신 AddColumns 또는 SelectColumns를 사용하여 식을 다시 작성할 수 있습니다.

CalculateTable(
    Filter(
        SelectColumns(
            'Reseller Sales',
            "ResellerKey", 
            [ResellerKey],
            "ProductKey",
            [ProductKey]
        ),
        And(Not IsBlank([ResellerKey]),  Not IsBlank([ProductKey]))
    ),
    Treatas({(229)}, 'Product'[Product Key])
)

이 다시 작성된 식은 GroupBy 작업이 업데이트에 의해 도입된 SelfValue 제한의 영향을 받지 않는 원래 의미 체계를 유지합니다.

Treatas에서 완전히 다루는 groupby 열에 대한 행 유효성 검사

이 업데이트 전에 SummarizeColumns 함수 내에서 특정 테이블의 모든 GroupBy 열이 아래와 같이 동일한 테이블의 단일 Treatas 필터로 완전히 적용된 경우:

SummarizeColumns(
  Geography[Country], 
  Geography[State], 
  Treatas(
      {("United States", "Alberta")}, 
      Geography[Country], 
      Geography[State]
  )
)

위의 쿼리의 결과에는 유효한지 여부에 관계없이 Treatas 필터에 지정된 행이 포함됩니다. 예를 들어 결과는 [Country] = "미국" 및 [State] = "Alberta"가 'Geography' 테이블에 없는 경우에도 단일 행 테이블("미국", "Alberta")이 됩니다.

이 문제는 알려진 것으로 업데이트에서 해결되었습니다. 업데이트 후에는 이러한 잘못된 행이 필터링되고 GroupBy 테이블의 유효한 행만 반환됩니다. 따라서 'Geography' 테이블에 지정된 [Country] 및 [State] 값과 일치하는 유효한 행이 없으므로 위의 쿼리 결과는 비어 있습니다.

동일한 테이블/클러스터에서 혼합 Keepfilters/overriddefilter를 허용하지 않습니다.

최근 업데이트에서는 다음과 같은 오류 메시지를 트리거하는 임시 제한이 도입되었습니다.

"SummarizeColumns filters with keepfilters behavior and overridefilters behavior are mixed within one cluster, which is not allowed. Consider adding keepfilters() to all filters of summarizecolumns." 

이 오류는 일반 필터(기존 필터를 재정의)와 KeepFilter가 지정된 필터가 동일한 테이블/클러스터 내에 있을 때 발생합니다. 예시:

Evaluate CalculateTable(
  SummarizeColumns(
      Product[Color],
      KeepFilters(
          TreatAs(
              {( "Washington")}
              , Geography[State]
          )
      ),
      TreatAs(
          {("United States"), ("Canada")}
          , Geography[Country]
      )
  )
  ,TreatAs({("Alberta")}, Geography[State])
  ,TreatAs({("Canada")}, Geography[Country])
)

위의 식에는 'Geography' 테이블에는 KeepFilter가 지정된 필터와 없는 필터의 두 가지가 있습니다. 이러한 필터는 서로 다른 열의 외부 필터와 겹칩니다. 현재 이 구성은 내부적으로 두 필터가 하나로 클러스터링되고 시스템에서 클러스터형 필터에 대한 올바른 필터 재정의 동작을 확인할 수 없기 때문에 허용되지 않습니다.

이 제한은 일시적입니다. 향후 업데이트에서 이러한 제한을 제거하기 위한 솔루션을 적극적으로 개발하고 있습니다. 이 오류가 발생하는 경우 각 테이블에서 일관된 재정의 동작을 보장하기 위해 필요에 따라 KeepFilters를 추가하거나 제거하여 SummarizeColumns 내에서 필터를 조정하는 것이 좋습니다.

요약하다