SUMMARIZECOLUMNS
Dotyczy:kolumna obliczeniowatabela obliczeniowaMeasureobliczenia wizualne
Zwraca tabelę podsumowania dla zestawu grup.
Składnia
SUMMARIZECOLUMNS( <groupBy_columnName> [, < groupBy_columnName >]…, [<filterTable>]…[, <name>, <expression>]…)
Parametry
Termin | Definicja |
---|---|
groupBy_columnName |
W pełni kwalifikowane odwołanie do kolumny (Tabela[Kolumna]) do tabeli podstawowej, dla której w zwracanej tabeli znajdują się odrębne values. Każda kolumna groupBy_columnName jest sprzężona krzyżowo (różne tabele) or automatycznie istniała (ta sama tabela) z kolejnymi określonymi kolumnami. |
filterTable |
Wyrażenie tabeli dodawane do kontekstu filter kolumn all określone jako argumenty groupBy_columnName. values obecne w tabeli filter są używane do filter przed wykonaniem sprzężenia krzyżowego/automatycznego istnienia. |
name |
Ciąg reprezentujący nazwę kolumny do użycia dla kolejnego określonego wyrażenia. |
expression |
Dowolne wyrażenie DAX zwracające pojedynczą value (not tabelę). |
Zwracanie value
Tabela zawierająca kombinacje values z podanych kolumn na podstawie określonego grupowania. Zwracana tabela zawiera tylko wiersze, dla których co najmniej jedno z podanych wyrażeń zwracablankvalue. If all wyrażenia evaluate do BLANK/NULL dla wiersza, ten wiersz jest not uwzględniony w zwróconej tabeli.
Uwagi
Ta funkcja not gwarantuje kolejność sortowania wyników.
Nie można określić kolumny więcej niż raz w parametrze groupBy_columnName. Na przykład następująca formuła jest nieprawidłowa.
SUMMARIZECOLUMNS( Sales[StoreId], Sales[StoreId] )
Ta funkcja jest not obsługiwana do użycia w trybie DirectQuery w przypadku użycia w kolumnach obliczeniowych or reguł zabezpieczeń na poziomie wiersza.
kontekst Filter
Rozważ następujące zapytanie:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
W tym zapytaniu bez measure kolumny groupBynot zawierają kolumny z wyrażenia FILTER (na przykład z tabeli Customer). filter jest not stosowany do kolumn groupBy. Tabele Sales Territory and Customer mogą być pośrednio related za pośrednictwem tabeli Sales Territory fact Reseller. Ponieważ są one not bezpośrednio related, filter wyrażenie jest no-op and kolumny groupBy są not wpływać.
Jednak w przypadku tego zapytania:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
Kolumny groupBy zawierają kolumnę, której dotyczy filterandfilter są stosowane do wyników groupBy.
Z IGNORE
Składnia IGNORE może służyć do modyfikowania zachowania funkcji SUMMARIZECOLUMNS przez pominięcie określonych wyrażeń z oceny BLANK/NULL. Wiersze, dla których wyrażenia allnot przy użyciu IGNORE zwracać BLANK/NULL, zostaną wykluczone niezależnie od tego, czy wyrażenia, które używają IGNOREevaluate do BLANK/NULL ornot. IGNORE można używać tylko w wyrażeniu SUMMARIZECOLUMNS.
Przykład
SUMMARIZECOLUMNS(
Sales[CustomerId], "Total Qty",
IGNORE( SUM( Sales[Qty] ) ),
"BlankIfTotalQtyIsNot3", IF( SUM( Sales[Qty] )=3, 3 )
)
Spowoduje to zestawienie kolumny Sales[CustomerId], tworząc sumę częściową dla all klientów w danym grupowaniu. Bez IGNOREwynik to:
Identyfikator klienta | Łączna liczba | BlankIfTotalQtyIsNot3 |
---|---|---|
A | 5 | |
B | 3 | 3 |
C | 3 | 3 |
Z IGNORE,
Identyfikator klienta | Łączna liczba | BlankIfTotalQtyIsNot3 |
---|---|---|
B | 3 | 3 |
C | 3 | 3 |
All wyrażenie ignorowane,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Even chociaż oba wyrażenia zwracają blank dla niektórych wierszy, są one uwzględniane, ponieważ nie ma żadnych nieu ignorowanych wyrażeń, które zwracają blank.
Identyfikator klienta | Blank | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
Z NONVISUAL
Funkcja NONVISUAL oznacza valuefilter w funkcji SUMMARIZECOLUMNS jako not wpływające na measurevalues, ale tylko do groupBy kolumn. NONVISUAL można używać tylko w wyrażeniu SUMMARIZECOLUMNS.
Przykład
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]
Zwraca wynik, w którym [Visual Total Sales] jest sumą w ciągu all lat:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9,791,060.30 | 29,358,677.22 |
2008 | 9,770,899.74 | 29,358,677.22 |
Z kolei to samo zapytanie bez funkcji 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]
Zwraca wynik, w którym [Visual Total Sales] jest sumą w ciągu dwóch wybranych lat:
DimDate[CalendarYear] | [Sales] | [Visual Total Sales] |
---|---|---|
2007 | 9,791,060.30 | 19,561,960.04 |
2008 | 9,770,899.74 | 19,561,960.04 |
Z ROLLUPADDISSUBTOTAL
Dodanie składni ROLLUPADDISSUBTOTAL modyfikuje zachowanie funkcji SUMMARIZECOLUMNS przez dodanie rollup/sum częściowych do wyniku na podstawie kolumn groupBy_columnName. ROLLUPADDISSUBTOTAL można używać tylko w wyrażeniu SUMMARIZECOLUMNS.
Przykład z pojedynczą sumą częściową
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]
Zwraca poniższą tabelę.
Kategoria | Podkategoria | IsCategorySubtotal | IsSubcategorySubtotal | Łączna liczba |
---|---|---|---|---|
True | True | 60398 | ||
Akcesoria | False | True | 36092 | |
Akcesoria | Stojaki rowerowe | False | False | 328 |
Rowery | Rowery górskie | False | False | 4970 |
Odzież | False | True | 9101 |
Przykład z wieloma sumami częściowymi
SUMMARIZECOLUMNS (
Regions[State], ROLLUPADDISSUBTOTAL ( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL ( Sales[Date], "IsDateSubtotal"), "Total Qty", SUM( Sales[Qty] )
)
Sprzedaż jest pogrupowana według stanu, według klienta, według date, z sumami częściowymi dla 1. Sprzedaż według stanu, według date 2. Sprzedaż według stanu, według klienta 3. Rzutowane na obu klienta anddate prowadzące do sprzedaży według stanu.
Zwraca poniższą tabelę.
CustomerID (Identyfikator klienta) | IsCustomerSubtotal | Stan | Łączna liczba | Date | IsDateSubtotal |
---|---|---|---|---|---|
A | FALSE |
WA | 5 | 2014-07-10 | |
B | FALSE |
WA | 1 | 2014-07-10 | |
B | FALSE |
WA | 2 | 7/11/2014 | |
C | FALSE |
OR | 2 | 2014-07-10 | |
C | FALSE |
OR | 1 | 7/11/2014 | |
TRUE |
WA | 6 | 2014-07-10 | ||
TRUE |
WA | 2 | 7/11/2014 | ||
TRUE |
OR | 2 | 2014-07-10 | ||
TRUE |
OR | 1 | 7/11/2014 | ||
A | FALSE |
WA | 5 | TRUE |
|
B | FALSE |
WA | 3 | TRUE |
|
C | FALSE |
OR | 3 | TRUE |
|
TRUE |
WA | 8 | TRUE |
||
TRUE |
OR | 3 | TRUE |
Z ROLLUPGROUP
Podobnie jak w przypadku funkcji SUMMARIZE, można użyć ROLLUPGROUP razem z ROLLUPADDISSUBTOTAL, aby określić grupy podsumowania/stopień szczegółowości (sumy częściowe) do uwzględnienia, zmniejszając liczbę zwracanych wierszy sumy częściowej. ROLLUPGROUP można używać tylko w wyrażeniu SUMMARIZECOLUMNSorSUMMARIZE.
Przykład z wieloma sumami częściowymi
SUMMARIZECOLUMNS(
ROLLUPADDISSUBTOTAL( Sales[CustomerId], "IsCustomerSubtotal" ),
ROLLUPADDISSUBTOTAL(ROLLUPGROUP(Regions[City], Regions[State]), "IsCityStateSubtotal"),"Total Qty", SUM( Sales[Qty] )
)
Nadal grupowane według stanu and miasta, ale rzutowane razem podczas raportowania sumy częściowej zwraca poniższą tabelę,
Stan | Identyfikator klienta | IsCustomerSubtotal | Łączna liczba | 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 |
OR | C | FALSE |
3 | Portland | FALSE |
WA | TRUE |
100 | Bellevue | FALSE |
|
WA | TRUE |
100 | Redmond | FALSE |
|
OR | TRUE |
3 | Portland | FALSE |
|
A | FALSE |
5 | FALSE |
||
B | FALSE |
3 | TRUE |
||
C | FALSE |
3 | TRUE |
||
TRUE |
11 | TRUE |
Kontekstowe SummarizeColumns
Tło
Do lutego 2023 r. SUMMARIZECOLUMNSnot obsługiwać ocenę w ramach przejścia kontekstu w all. W produktach wydanych przed monthto ograniczenie sprawiło, że SUMMARIZECOLUMNSnot przydatne w większości miar — not było możliwe wywołanie measureSUMMARIZECOLUMNS w każdym przypadku przejścia kontekstu, w tym innych SUMMARIZECOLUMNSstatements.
Od lutego 2023 r. przejście kontekstu było obsługiwane w kilku scenariuszach, ale not w all warunków. Obsługiwane przypadki and z ograniczeniami są następujące:
typ SummarizeColumns | Zewnętrzne Filter z jedną kolumną | Filter zewnętrzne z więcej niż jedną kolumną | Kolumny GroupBy zewnętrzne |
---|---|---|---|
SummarizeColumns tylko z GroupBy | OK | OK | OK |
SummarizeColumns z Filters/Measures | OK | ERROR | ERROR |
Od czerwca 2024 r. włączamy kontekstowe SummarizeColumns, które umożliwiają ocenę SummarizeColumns w dowolnym przejściu kontekstu, SummarizeColumns w measure jest now w pełni obsługiwana:
typ SummarizeColumns | Zewnętrzne Filter z jedną kolumną | Filter zewnętrzne z więcej niż jedną kolumną | Kolumny GroupBy zewnętrzne |
---|---|---|---|
SummarizeColumns tylko z GroupBy | OK | OK | OK |
SummarizeColumns z Filters/Measures | OK | OK | OK |
Jednak ta aktualizacja obejmuje również zmiany zachowania SummarizeColumns, co może spowodować zmianę wyników istniejących wyrażeń:
Semantyka SelfValue dla filters zewnętrznych
Wprowadzamy semantyczną koncepcję o nazwie SelfValue, która zmienia sposób interakcji filters z tabel zewnętrznych z kolumnami GroupBy w SummarizeColumns. Ta zmiana nie zezwala filters z innej tabeli na wpływ na kolumny GroupBy, evenif tabele są related za pośrednictwem relacji filter-by. Przykład ilustrujący wpływ tej zmiany obejmuje następujące wyrażenie:
CalculateTable(
SummarizeColumns(
'Reseller Sales'[ResellerKey],
'Reseller Sales'[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
Przed tą aktualizacją TreatAsfilter będą miały zastosowanie do operacji GroupBy w SummarizeColumns, wykorzystując relację międzyProduct"[Product Key] and "Reseller Sales" [ProductKey]. W związku z tym wyniki zapytania będą zawierać tylko wiersze, w których wartość "Reseller Sales" [ProductKey] wynosi 229. Jednak po aktualizacji GroupBy kolumny w SummarizeColumns nie będą już filtrowane według kolumn z tabel zewnętrznych, evenif istnieje relacja między nimi. W związku z tym w powyższym przykładzie kolumna GroupBy "Reseller Sales" [ProductKey] będzie not filtrowana według kolumny "Product"[ProductKey]. W rezultacie zapytanie będzie zawierać wiersze, w których wartość "Reseller Sales" [ProductKey] jest not równa 229.
If wolisz zachować zachowanie previous, możesz ponownie napisać wyrażenie przy użyciu Summarize zamiast SummarizeColumns, jak pokazano poniżej:
CalculateTable(
SUMMARIZE(
'Reseller Sales',
[ResellerKey],
[ProductKey]
),
Treatas({(229)}, 'Product'[Product Key])
)
To wyrażenie przepisane zachowuje oryginalną semantykę, w której operacja GroupBy jest not dotknięta ograniczeniem SelfValue wprowadzonym przez aktualizację.
Sprawdzanie poprawności wierszy dla kolumn groupby w pełni objętych Treatas
Przed tą aktualizacją w ramach funkcji SummarizeColumnsifallGroupBy kolumny z określonej tabeli były w pełni objęte pojedynczą Treatasfilter z tej samej tabeli, jak pokazano poniżej:
SummarizeColumns(
Geography[Country],
Geography[State],
Treatas(
{("United States", "Alberta")},
Geography[Country],
Geography[State]
)
)
Wynik powyższego zapytania obejmowałby wszystkie wiersze określone w Treatasfilter, niezależnie od tego, czy były prawidłowe ornot. Na przykład wynikiem będzie tabela z pojedynczym wierszem ("Stany Zjednoczone", "Alberta"), evenif nie ma takiego wiersza z [Country] = "United States" and [State] = "Alberta" istniała w tabeli "Geography".
Ten problem był znany and został rozwiązany przez aktualizację. Po aktualizacji zostaną odfiltrowane takie nieprawidłowe wiersze, and zostaną zwrócone tylko prawidłowe wiersze z tabeli GroupBy. W związku z tym wynik powyższego zapytania będzie pusty, ponieważ w tabeli "Geography" nie ma prawidłowych wierszy pasujących do określonego [Country] and [State] values.
Nie zezwalaj na mieszany Keepfilters/overriddefilters w tej samej tabeli/klastrze
Ostatnia aktualizacja wprowadziła tymczasowe ograniczenie, które wyzwala komunikat error z informacją:
"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."
Ten error występuje, gdy obie normalne filters (które zastępują istniejące filters) andfilters z określonymi KeepFilters są obecne w tej samej tabeli/klastrze. Na przykład:
Evaluate CalculateTable(
SummarizeColumns(
Product[Color],
KeepFilters(
TreatAs(
{( "Washington")}
, Geography[State]
)
),
TreatAs(
{("United States"), ("Canada")}
, Geography[Country]
)
)
,TreatAs({("Alberta")}, Geography[State])
,TreatAs({("Canada")}, Geography[Country])
)
W powyższym wyrażeniu istnieją dwa filters w tabeli "Geography": jeden z KeepFilters określonym and bez. Te filters nakładają się na zewnętrzne filters w różnych kolumnach. Obecnie ta konfiguracja jest not dozwolona, ponieważ wewnętrznie dwa filters są klastrowane w jeden, and system nie może określić prawidłowego filter zastępowania zachowania klastrowanego filter ogólnie w takich przypadkach.
Należy pamiętać, że to ograniczenie jest tymczasowe. Aktywnie opracowujemy rozwiązania, aby usunąć to ograniczenie w przyszłych aktualizacjach. If napotkasz tę error, zalecamy dostosowanie filters w ramach SummarizeColumns przez dodanie or usuwania KeepFilters w razie potrzeby w celu zapewnienia spójnego zastępowania zachowania w każdej tabeli.