SUMMARIZECOLUMNS
Dotyczy:kolumna obliczeniowa
tabela obliczeniowa
Miara
wizualizacji
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 wartości. Każda kolumna groupBy_columnName jest sprzężona krzyżowo (różne tabele) lub automatycznie istniała (ta sama tabela) z kolejnymi określonymi kolumnami. |
filterTable |
Wyrażenie tabeli, które jest dodawane do kontekstu filtru wszystkich kolumn określonych jako argumenty groupBy_columnName. Wartości obecne w tabeli filtrów są używane do filtrowania 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 |
Każde wyrażenie DAX zwracające pojedynczą wartość (a nie tabelę). |
Wartość zwracana
Tabela zawierająca kombinacje wartości z podanych kolumn na podstawie określonego grupowania. Zwracane są tylko wiersze, dla których co najmniej jedno z podanych wyrażeń zwraca wartość niepustą. Jeśli wszystkie wyrażenia obliczają wartość BLANK/NULL dla wiersza, ten wiersz nie jest uwzględniony w zwracanej tabeli.
Uwagi
Ta funkcja nie gwarantuje żadnej kolejności 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 nie jest obsługiwana w trybie DirectQuery w przypadku użycia w kolumnach obliczeniowych lub regułach zabezpieczeń na poziomie wiersza.
Kontekst filtru
Rozważ następujące zapytanie:
SUMMARIZECOLUMNS (
'Sales Territory'[Category],
FILTER('Customer', 'Customer' [First Name] = "Alicia")
)
W tym zapytaniu bez miary kolumny groupBy nie zawierają żadnych kolumn z wyrażenia FILTER (na przykład z tabeli Customer). Filtr nie jest stosowany do kolumn groupBy. Tabele Sales Territory (Terytorium sprzedaży) i Customer (Klient) mogą być pośrednio powiązane z tabelą faktów Reseller (Sprzedawca). Ponieważ nie są one bezpośrednio powiązane, wyrażenie filtru jest no-op, a kolumny groupBy nie mają wpływu.
Jednak w przypadku tego zapytania:
SUMMARIZECOLUMNS (
'Sales Territory'[Category], 'Customer' [Education],
FILTER('Customer', 'Customer'[First Name] = "Alicia")
)
Kolumny groupBy zawierają kolumnę, która ma wpływ na filtr i filtr jest stosowany do wyników grupowania Według.
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 wszystkie wyrażenia, dla których nie są używane IGNORE zwracane BLANK/NULL, zostaną wykluczone niezależnie od tego, czy wyrażenia, które używają IGNORE, mają wartość BLANK/NULL, czy nie. 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 zwijanie kolumny Sales[CustomerId] i utworzenie sumy częściowej dla wszystkich 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 |
Wszystkie wyrażenie jest ignorowane,
SUMMARIZECOLUMNS(
Sales[CustomerId], "Blank",
IGNORE( BLANK() ), "BlankIfTotalQtyIsNot5",
IGNORE( IF( SUM( Sales[Qty] )=5, 5 ) )
)
Mimo że oba wyrażenia zwracają wartość pustą dla niektórych wierszy, są one uwzględniane, ponieważ nie ma nie zignorowanych wyrażeń, które zwracają puste.
Identyfikator klienta | Pusty | BlankIfTotalQtyIsNot5 |
---|---|---|
A | 5 | |
B | ||
C |
Z NONVISUAL
Funkcja NONVISUAL oznacza filtr wartości w funkcji SUMMARIZECOLUMNS nie wpływa na wartości miary, ale tylko do kolumn grupowania według. 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ą we wszystkich latach:
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 wierszy zestawień/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 |
---|---|---|---|---|
Prawdziwy | Prawdziwy | 60398 | ||
Akcesoria | Fałszywy | Prawdziwy | 36092 | |
Akcesoria | Stojaki rowerowe | Fałszywy | Fałszywy | 328 |
Rowery | Rowery górskie | Fałszywy | Fałszywy | 4970 |
Odzież | Fałszywy | Prawdziwy | 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 grupowana według stanu, według klienta, według daty, z sumami częściowymi dla 1. Sprzedaż według stanu, według daty 2. Sprzedaż według stanu, według klienta 3. Rzutowane zarówno na klienta, jak i na datę prowadzącą do sprzedaży według stanu.
Zwraca poniższą tabelę.
CustomerID (Identyfikator klienta) | IsCustomerSubtotal | Stan | Łączna liczba | Data | 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 SUMMARIZECOLUMNS lub SUMMARIZE.
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 miasta i stanu, 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 kolumny podsumowania
Tło
Do lutego 2023 r. SUMMARIZECOLUMNS w ogóle nie obsługiwała oceny w ramach przejścia kontekstu. W produktach wydanych przed tym miesiącem to ograniczenie sprawiło, że SUMMARIZECOLUMNS nie jest przydatne w większości miar — nie można było wywołać miary SUMMARIZECOLUMNS w każdym przypadku przejścia kontekstu, w tym innych instrukcji SUMMARIZECOLUMNS.
Od lutego 2023 r. przejście kontekstowe było obsługiwane w kilku scenariuszach, ale nie we wszystkich warunkach. Obsługiwane i ograniczone przypadki są następujące:
Typ summarizeColumns | Filtr zewnętrzny z jedną kolumną | Filtr zewnętrzny z więcej niż jedną kolumną | Kolumny grup zewnętrznych wg |
---|---|---|---|
Funkcja SummarizeColumns tylko z grupąBy | OK | OK | OK |
SummarizeColumns z filtrami/miarami | OK | ERROR | ERROR |
Od czerwca 2024 r. włączamy kontekstowe kolumny SummarizeColumns, które umożliwiają ocenę funkcji SummarizeColumns w dowolnym przejściu kontekstu, funkcja SummarizeColumns w miarie jest teraz w pełni obsługiwana:
Typ summarizeColumns | Filtr zewnętrzny z jedną kolumną | Filtr zewnętrzny z więcej niż jedną kolumną | Kolumny grup zewnętrznych wg |
---|---|---|---|
Funkcja SummarizeColumns tylko z grupąBy | OK | OK | OK |
SummarizeColumns z filtrami/miarami | OK | OK | OK |
Jednak ta aktualizacja obejmuje również zmiany zachowania funkcji SummarizeColumns, co może spowodować zmianę wyników istniejących wyrażeń:
Semantyka SelfValue dla filtrów zewnętrznych
Wprowadzamy semantyczną koncepcję o nazwie SelfValue, która zmienia sposób interakcji filtrów z tabel zewnętrznych z kolumn GroupBy w funkcji SummarizeColumns. Ta zmiana nie zezwala filtrom z innej tabeli na wpływ na kolumny Grupuj według, nawet jeśli tabele są powiązane za pośrednictwem relacji filtru według. 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ą filtr TreatAs będzie stosowany do operacji Grupuj według w kolumnie SummarizeColumns, wykorzystując relację między "Produktem"[Klucz produktu] i "Sprzedaż odsprzedawcy" [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 kolumny Grupuj według w kolumnach SummarizeColumns nie będą już filtrowane według kolumn z tabel zewnętrznych, nawet jeśli istnieje relacja między nimi. W związku z tym w powyższym przykładzie kolumna GroupBy "Reseller Sales" [ProductKey] nie będzie filtrowana według kolumny "Product"[ProductKey]. W rezultacie zapytanie będzie zawierać wiersze, w których wartość "Reseller Sales" [ProductKey] nie jest równa 229.
Jeśli wolisz zachować poprzednie zachowanie, możesz ponownie napisać wyrażenie przy użyciu funkcji Summarize zamiast funkcji 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 nie ma wpływu na ograniczenie SelfValue wprowadzone przez aktualizację.
Walidacja wierszy dla kolumn grupowania w pełni objętych traktatami
Przed tą aktualizacją w funkcji SummarizeColumns, jeśli wszystkie kolumny Grupuj według z określonej tabeli zostały w pełni objęte jednym filtrem Treatas 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 będzie zawierać wiersze określone w filtrze Treatas, niezależnie od tego, czy były prawidłowe, czy nie. Na przykład wynik będzie tabelą z pojedynczym wierszem ("Stany Zjednoczone", "Alberta"), nawet jeśli taki wiersz z [Country] = "United States" i [State] = "Alberta" istniał w tabeli "Geography".
Ten problem był znany i został rozwiązany przez aktualizację. Po aktualizacji takie nieprawidłowe wiersze zostaną odfiltrowane i 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ślonych wartości [Country] i [State].
Nie zezwalaj na mieszane filtrowanie/zastępowanie filtrów w tej samej tabeli/klastrze
Ostatnia aktualizacja wprowadziła tymczasowe ograniczenie, które wyzwala komunikat o błędzie 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 błąd występuje, gdy oba filtry normalne (które zastępują istniejące filtry) i filtry z określonymi filtrami 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 filtry w tabeli "Geography": jeden z określonymi parametrami KeepFilters i jednym bez. Te filtry nakładają się na filtry zewnętrzne w różnych kolumnach. Obecnie ta konfiguracja nie jest dozwolona, ponieważ wewnętrznie dwa filtry są klasterowane w jeden, a system nie może określić prawidłowego zachowania zastępowania filtru dla filtru klastrowanego w takich przypadkach.
Należy pamiętać, że to ograniczenie jest tymczasowe. Aktywnie opracowujemy rozwiązania, aby usunąć to ograniczenie w przyszłych aktualizacjach. Jeśli wystąpi ten błąd, zalecamy dostosowanie filtrów w kolumnie SummarizeColumns przez dodanie lub usunięcie filtrów KeepFilters w razie potrzeby w celu zapewnienia spójnego zachowania zastępowania w każdej tabeli.