Sdílet prostřednictvím


SUMMARIZECOLUMNS

Platí pro: Výpočet počítané tabulky Počítaná tabulka Výpočet vizuálu

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.
výraz Libovolný výraz DAX, který vrací jednu hodnotu (ne tabulku).

Vrácená 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 jsou všechny výrazy vyhodnoceny 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 spolu přímo nesouvisí, výraz filtru je 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.

Pomocí funkce IGNORE

Syntaxi IGNORE lze použít k úpravě chování funkce SUMMARIZECOLUMNS vynecháním konkrétních výrazů z vyhodnocení BLANK/NULL. Řádky, pro které všechny výrazy nepoužívají ignore return BLANK/NULL, budou vyloučeny nezávisle na tom, jestli se výrazy, které používají ignore , vyhodnotí na 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 funkce IGNORE je výsledek následující:

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

Pomocí funkce 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 prázdnou BlankIfTotalQtyIsNot5
A 5
T
C

S NONVISUAL

Funkce NONVISUAL označuje 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 funkcí 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
True True 60398
Accessories False True 36092
Accessories Stojany na kola False False 328
Bikes Mountain Bikes False False 4970
Clothing False True 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 Datum IsDateSubtotal
A FALSE WA 5 7/10/2014
T FALSE WA 0 7/10/2014
T FALSE WA 2 7/11/2014
C FALSE NEBO 2 7/10/2014
C FALSE NEBO 0 7/11/2014
TRUE WA 6 7/10/2014
TRUE WA 2 7/11/2014
TRUE NEBO 2 7/10/2014
TRUE NEBO 0 7/11/2014
A FALSE WA 5 TRUE
T FALSE WA 3 TRUE
C FALSE NEBO 3 TRUE
TRUE WA 8 TRUE
TRUE NEBO 3 TRUE

S funkcí ROLLUPGROUP

Stejně jako u funkce SUMMARIZE lze funkci ROLLUPGROUP použít společně s funkcí ROLLUPADDISSUBTOTAL k určení, které souhrnné skupiny a členitosti (mezisoučty) se mají zahrnout, čímž se sníží počet vrácených řádků mezisoučtu. 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
NEBO C FALSE 3 Portland FALSE
WA TRUE 4 Bellevue FALSE
WA TRUE 4 Jihlava FALSE
NEBO 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 funkce SUMMARIZECOLUMNS vůbec nepodporuje vyhodnocení v rámci přechodu kontextu. V produktech vydaných před tímto měsícem toto omezení neučinilo funkci SUMMARIZECOLUMNS ve většině měr – v žádném případě přechodu kontextu, včetně jiných příkazů SUMMARIZECOLUMNS, nebylo možné volat míru 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 CHYBA CHYBA

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í addColumns nebo SelectColumns místo SummarizeColumns, jak je znázorněno níže:

CalculateTable(
    Filter(
        SelectColumns(
            'Reseller Sales',
            "ResellerKey", 
            [ResellerKey],
            "ProductKey",
            [ProductKey]
        ),
        And(Not IsBlank([ResellerKey]),  Not IsBlank([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 byla například tabulka s jedním řádkem ("USA", "Alberta"), i když žádný takový řádek s [Country] = "USA" 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.

SHRNOUT