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.