Sdílet prostřednictvím


SUMMARIZECOLUMNS

platí pro:Počítaný sloupecPočítaná tabulkamíravizuální

Vrátí souhrnnou tabulku nad sadou skupin.

Syntaxe

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

Parametry

Pojem definice
groupBy_columnName Plně kvalifikovaný odkaz na sloupec (Table[Column]) na základní tabulku, pro kterou jsou do vrácené tabulky zahrnuty jedinečné hodnoty. Každý groupBy_columnName sloupec je křížově spojený (různé tabulky) nebo automaticky existoval (stejná tabulka) s následnými zadanými sloupci.
filterTable Výraz tabulky, který se přidá do kontextu filtru všech sloupců zadaných jako groupBy_columnName argumenty. Hodnoty, které jsou přítomné v tabulce filtru, se používají k filtrování před provedením křížového spojení nebo automatického vytvoření.
name Řetězec představující název sloupce, který se má použít pro následující zadaný výraz.
expression Libovolný DAX výraz, který vrací jednu hodnotu (ne tabulku).

Návratová hodnota

Tabulka, která obsahuje kombinace hodnot ze zadaných sloupců na základě zadaného seskupení. Do vrácené tabulky se zahrnou pouze řádky, pro které alespoň jeden ze zadaných výrazů vrátí neprázdnou hodnotu. Pokud se všechny výrazy vyhodnotí jako BLANK/NULL pro řádek, nebude tento řádek zahrnut do vrácené tabulky.

Poznámky

  • Tato funkce nezaručuje žádné pořadí řazení výsledků.

  • V parametru groupBy_columnName nelze zadat sloupec více než jednou. Následující vzorec je například neplatný.

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

  • Tato funkce není podporována pro použití v režimu DirectQuery při použití v počítaných sloupcích nebo pravidlech zabezpečení na úrovni řádků (RLS).

Kontext filtru

Představte si následující dotaz:

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

V tomto dotazu bez míry sloupce groupBy neobsahují žádné sloupce z výrazu FILTER (například z tabulky Customer). Filtr se nepoužije na sloupce groupBy. Tabulky Sales Territory a Customer můžou nepřímo souviset prostřednictvím tabulky faktů Prodej prodejců. Vzhledem k tomu, že nejsou přímo související, je výraz filtru no-op a sloupce groupBy nejsou ovlivněny.

Nicméně s tímto dotazem:

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

Sloupce groupBy obsahují sloupec, který má vliv na filtr a tento filtr se použije na výsledky groupBy.

S IGNORE

Syntaxi IGNORE lze použít ke změně chování funkce SUMMARIZECOLUMNS vynecháním konkrétních výrazů z vyhodnocení BLANK/NULL. Řádky, pro které všechny výrazy, které nepoužívají IGNORE vracejí BLANK/NULL, budou vyloučeny nezávisle na tom, zda se výrazy, které používají IGNORE vyhodnotí jako BLANK/NULL, nebo ne. IGNORE lze použít pouze ve výrazu SUMMARIZECOLUMNS.

Příklad

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

Tím se zobrazí sloupec Sales[CustomerId] a vytvoří se mezisoučt pro všechny zákazníky v daném seskupení. Bez IGNOREje výsledek:

CustomerId Total Qty BlankIfTotalQtyIsNot3
A 5
T 3 3
C 3 3

S IGNORE,

CustomerId Total Qty BlankIfTotalQtyIsNot3
T 3 3
C 3 3

Všechny výrazy jsou ignorovány,

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

I když oba výrazy vrací pro některé řádky prázdné hodnoty, jsou zahrnuté, protože neexistují žádné negnorední výrazy, které vracejí prázdné hodnoty.

CustomerId Bianko BlankIfTotalQtyIsNot5
A 5
T
C

S NONVISUAL

Funkce NONVISUAL označí filtr hodnot ve funkci SUMMARIZECOLUMNS, protože nemá vliv na hodnoty měr, ale vztahuje se pouze na sloupce groupBy. NONVISUAL lze použít pouze ve výrazu SUMMARIZECOLUMNS.

Příklad

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]

Vrátí výsledek, kde [Visual Total Sales] je celkový součet za všechny roky:

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

Naproti tomu stejný dotaz bez funkce 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]

Vrátí výsledek, kde [Visual Total Sales] je celkový součet za dva vybrané roky:

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

S ROLLUPADDISSUBTOTAL

Přidání syntaxe ROLLUPADDISSUBTOTAL upraví chování funkce SUMMARIZECOLUMNS přidáním souhrnných nebo mezisoučtových řádků do výsledku na základě groupBy_columnName sloupců. ROLLUPADDISSUBTOTAL lze použít pouze ve výrazu SUMMARIZECOLUMNS.

Příklad s jedním mezisoučtem

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]

Vrátí následující tabulku:

Kategorie Podkategorie IsCategorySubtotal IsSubcategorySubtotal Total Qty
Pravdivý Pravdivý 60398
Accessories Falešný Pravdivý 36092
Accessories Stojany na kola Falešný Falešný 328
Bikes Mountain Bikes Falešný Falešný 4970
Clothing Falešný Pravdivý 9101

Příklad s více mezisoučty

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

Prodej je seskupený podle státu podle zákazníka podle data s mezisoučty pro 1. Sales by state, by date 2. Sales by State, by Customer 3. Zahrnuté na zákazníka i datum, které vede k prodeji podle státu.

Vrátí následující tabulku:

CustomerID IsCustomerSubtotal State Total Qty Rande IsDateSubtotal
A FALSE WA 5 7/10/2014
T FALSE WA 0 7/10/2014
T FALSE WA 2 7/11/2014
C FALSE OR 2 7/10/2014
C FALSE OR 0 7/11/2014
TRUE WA 6 7/10/2014
TRUE WA 2 7/11/2014
TRUE OR 2 7/10/2014
TRUE OR 0 7/11/2014
A FALSE WA 5 TRUE
T FALSE WA 3 TRUE
C FALSE OR 3 TRUE
TRUE WA 8 TRUE
TRUE OR 3 TRUE

S ROLLUPGROUP

Stejně jako u funkce SUMMARIZE lze ROLLUPGROUP použít společně s ROLLUPADDISSUBTOTAL k určení, které souhrnné skupiny a členitosti (mezisoučty) se mají zahrnout, což snižuje počet vrácených řádků mezisoučtů. ROLLUPGROUP lze použít pouze ve výrazu SUMMARIZECOLUMNS nebo SUMMARIZE.

Příklad s více mezisoučty

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

Stále seskupené podle města a státu, ale seskupené dohromady při hlášení mezisoučtu vrátí následující tabulku,

State CustomerId IsCustomerSubtotal Total Qty City IsCityStateSubtotal
WA A FALSE 2 Bellevue FALSE
WA T FALSE 2 Bellevue FALSE
WA A FALSE 3 Jihlava FALSE
WA T FALSE 0 Jihlava FALSE
OR C FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Jihlava FALSE
OR TRUE 3 Portland FALSE
A FALSE 5 FALSE
T FALSE 3 TRUE
C FALSE 3 TRUE
TRUE 11 TRUE

Kontextová funkce SummarizeColumns

Pozadí

Do února 2023 SUMMARIZECOLUMNS vůbec nepodporuje hodnocení v rámci přechodu kontextu. V produktech vydaných před tímto měsícem bylo toto omezení SUMMARIZECOLUMNS ve většině opatření užitečné – nebylo možné volat míru SUMMARIZECOLUMNS v žádném případě přechodu kontextu, včetně jiných příkazů SUMMARIZECOLUMNS.

Od února 2023 byl kontextový přechod podporován v několika scénářích, ale ne ve všech podmínkách. Podporované a omezené případy jsou následující:

Typ SummarizeColumns Externí filtr s jedním sloupcem Externí filtr s více než jedním sloupcem Externí sloupce GroupBy
SummarizeColumns s pouze GroupBy OK OK OK
SummarizeColumns with Filters/Measures OK ERROR ERROR

Od června 2024 povolujeme kontextové funkce SummarizeColumns, které umožňují vyhodnotit funkce SummarizeColumns v jakémkoli kontextu přechodu, funkce SummarizeColumns v míře je nyní plně podporovaná:

Typ SummarizeColumns Externí filtr s jedním sloupcem Externí filtr s více než jedním sloupcem Externí sloupce GroupBy
SummarizeColumns s pouze GroupBy OK OK OK
SummarizeColumns with Filters/Measures OK OK OK

Tato aktualizace ale také zahrnuje změny chování funkce SummarizeColumns, které mohou změnit výsledky existujících výrazů:

Sémantika SelfValue pro externí filtry

Představujeme sémantický koncept s názvem SelfValue, který mění způsob interakce filtrů z externích tabulek se sloupci GroupBy v summarizeColumns. Tato změna zakáže filtry z jiné tabulky, aby ovlivnily sloupce GroupBy, a to i v případě, že tabulky souvisejí prostřednictvím relace podle filtru. Příkladem, který ilustruje dopad této změny, je následující výraz:

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

Před touto aktualizací by se filtr TreatAs použil na operaci GroupBy v rámci summarizeColumns s využitím relace mezi Product[Product Key] a Reseller Sales[ProductKey]. V důsledku toho by výsledky dotazu zahrnovaly pouze řádky, ve kterých se "Reseller Sales"[ProductKey] rovná 229. Po aktualizaci se sloupce GroupBy v rámci summarizeColumns už nebudou filtrovat podle sloupců z externích tabulek, i když mezi nimi existuje relace. Proto ve výše uvedeném příkladu sloupec GroupBy Reseller Sales[ProductKey] nebude filtrován podle sloupce Product[ProductKey]. Výsledkem bude, že dotaz bude obsahovat řádky, ve kterých se "Reseller Sales"[ProductKey] nerovná 229.

Pokud chcete zachovat předchozí chování, můžete výraz přepsat pomocí funkce Summarize místo funkce SummarizeColumns, jak je znázorněno níže:

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

Tento přepsaný výraz zachovává původní sémantiku, kde operace GroupBy není ovlivněna omezením SelfValue zavedeným aktualizací.

Ověřování řádků pro sloupce groupby plně pokryté Treatas

Před touto aktualizací v rámci funkce SummarizeColumns byly všechny sloupce GroupBy z konkrétní tabulky plně pokryty jedním filtrem Treatas ze stejné tabulky, jak je znázorněno níže:

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

Výsledek výše uvedeného dotazu by zahrnoval libovolné řádky zadané ve filtru Treatas bez ohledu na to, jestli byly platné nebo ne. Výsledkem by například byla tabulka s jedním řádkem ("Spojené státy", "Alberta"), i když žádný takový řádek s [Country] = "United States" a [State] = "Alberta" existoval v tabulce 'Geography'.

Tento problém byl známý a byl vyřešen aktualizací. Po aktualizaci se tyto neplatné řádky vyfiltrují a vrátí se pouze platné řádky z tabulky GroupBy. Výsledek výše uvedeného dotazu by proto byl prázdný, protože neexistují žádné platné řádky odpovídající zadaným hodnotám [Country] a [State] v tabulce Geography.

Zákaz smíšených filtrů Keepfilters/overriddefilters ve stejné tabulce nebo clusteru

Nedávná aktualizace zavedla dočasné omezení, které aktivuje chybovou zprávu s oznámením:

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

K této chybě dochází, když jsou v rámci stejné tabulky nebo clusteru přítomny normální filtry (které přepíší existující filtry) i filtry se zadanými filtry KeepFilters. Příklad:

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

Ve výše uvedeném výrazu jsou v tabulce Geography dva filtry: jeden se zadanými filtry KeepFilters a jedním bez. Tyto filtry se překrývají s externími filtry v různých sloupcích. Tato konfigurace není v současné době povolená, protože interně jsou dva filtry seskupené do jednoho a systém nemůže určit správné chování přepsání filtru pro clusterovaný filtr celkově v takových případech.

Upozorňujeme, že toto omezení je dočasné. Aktivně vyvíjíme řešení pro odebrání tohoto omezení v budoucích aktualizacích. Pokud narazíte na tuto chybu, doporučujeme upravit filtry v rámci funkce SummarizeColumns přidáním nebo odebráním filtru KeepFilters podle potřeby, aby se zajistilo konzistentní chování přepsání v každé tabulce.

SUMMARIZE