Udział procentowy w DAX - ALL, ALLSELECTED czy REMOVEFILTERS
Udostępnij na:
Spis treści
Power BI - DAX liczy, ale nie to, czego oczekujesz
Udział procentowy w DAX - ALL, ALLSELECTED czy REMOVEFILTERS
W skrócie
Udział procentowy w DAX to sprzedaż wiersza podzielona przez mianownik z CALCULATE, który zdejmuje część filtrów. Po dodaniu fragmentatora ten sam udział sumuje się raz do 100%, a raz do 27% albo 51%.
REMOVEFILTERS() bez argumentu zdejmuje wszystkie filtry, także fragmentator roku. ALL i REMOVEFILTERS z tabelą produktów zdejmują wszystko w tej tabeli, także wybór kategorii. ALLSELECTED zostawia wybór z fragmentatorów.
Najpierw ustal, udział w czym ma pokazać raport: w całej historii, w wybranym okresie czy w wyborze użytkownika. Potem dobierz funkcję i zakres, a wiersza Suma użyj jako testu poprawności.
Udział procentowy w DAX buduje prawie każdy raport sprzedażowy: jaki procent obrotu daje kategoria, marka albo sklep. Problem zaczyna się, gdy na stronie pojawia się fragmentator i ten sam udział przestaje sumować się do 100%. Pokazujemy na modelu Nordvelli, jak ALL, ALLSELECTED i REMOVEFILTERS zachowują się przy fragmentatorze roku, kategorii i marki, i jak wybrać mianownik pod pytanie biznesowe.
Jak to wygląda w praktyce
Macierz kategorii (pole DimProdukty[Kategoria] w wierszach) z miarą Udział w sprzedaży % z kursu bez żadnego filtra pokazuje AGD/RTV 41,2%, Komputery 27,9%, Telefony 22,9%, Akcesoria 8,0% i 100,0% w wierszu Suma. Po zaznaczeniu we fragmentatorze roku 2025 udziały spadają do 11,1%, 7,6%, 6,2% i 2,2%, a wiersz Suma pokazuje 27,1%.
Inna wersja miary, z mianownikiem REMOVEFILTERS(DimProdukty), przy samym roku daje 100%, ale po zaznaczeniu we fragmentatorze dwóch kategorii pokazuje Komputery 28,11% i Telefony 23,03%, razem 51,14%. Ktoś, kto pytał o podział wybranej pary, oczekiwał dwóch liczb sumujących się do 100%. Żadna z tych miar nie jest błędna składniowo, każda odpowiada na inne pytanie.
Kolumna Udział w sprzedaży % w macierzy bez fragmentatora. Wiersz Suma pokazuje 100,0%.
Wszystkie trzy funkcje użyte jako argument CALCULATE usuwają filtry, a różnią się zasięgiem. Miara z kursu ma mianownik CALCULATE([Łączna sprzedaż], REMOVEFILTERS()). REMOVEFILTERS bez argumentu zdejmuje filtry ze wszystkich tabel modelu, także fragmentator roku, sklepu czy regionu. Mianownik to wtedy zawsze cała sprzedaż sieci, 467 775 009,17 zł, a w 2025 sieć sprzedała 126 734 270,47 zł, czyli 27,09% tej kwoty.
ALL(DimProdukty) i REMOVEFILTERS(DimProdukty) zdejmują filtry tylko z tabeli produktów. Rok, sklep i region zostają, ale znika też wybór kategorii albo marki we fragmentatorze, bo te kolumny leżą w tej samej tabeli. W roli argumentu CALCULATE obie funkcje dają ten sam wynik, a REMOVEFILTERS według dokumentacji Microsoft służy tylko do czyszczenia filtrów i nie zwraca tabeli. ALLSELECTED(DimProdukty) zdejmuje filtr nałożony przez wiersz wizualizacji, a zostawia to, co wybrano we fragmentatorach i filtrach. Dokumentacja opisuje to tak, że funkcja zachowuje filtry ustawione jawnie w zapytaniu i wszystkie konteksty poza filtrami wierszy i kolumn.
Co zrobić krok po kroku
Zapisz pytanie, na które odpowiada udział. „Jaką część całej historii sprzedaży daje kategoria” to mianownik bez żadnych filtrów. „Jaką część sprzedaży w wybranym okresie i sklepie daje kategoria” to mianownik bez filtrów produktu. „Jak dzielą się wybrane kategorie” to mianownik z wyborem użytkownika. Od tej decyzji zależy funkcja, a nie od tego, która jest krótsza.
Do udziału w bieżącym okresie, sklepie i regionie zdejmij filtry tylko z tabeli produktów: prawy przycisk na FaktSprzedaz w panelu Dane, Nowa miara, a na karcie Narzędzia miar wpisz w polu Format0.00%. Przy fragmentatorze roku 2025 miara daje AGD/RTV 40,88%, Komputery 28,11%, Telefony 23,03% i Akcesoria 7,98%, razem 100%.
Udział w okresie % =
DIVIDE (
[Łączna sprzedaż],
CALCULATE ( [Łączna sprzedaż], REMOVEFILTERS ( DimProdukty ) )
)
Do udziału w wyborze użytkownika użyj ALLSELECTED. Przy roku 2025 i zaznaczonych we fragmentatorze Komputerach i Telefonach miara daje 54,97% i 45,03%, razem 100%, a miara z kroku 2 zostaje przy 28,11% i 23,03%, bo pokazuje udział w całym roku. Gdy fragmentator kategorii jest pusty, obie miary dają te same liczby.
Udział w wyborze % =
DIVIDE (
[Łączna sprzedaż],
CALCULATE ( [Łączna sprzedaż], ALLSELECTED ( DimProdukty ) )
)
Uważaj na fragmentator z innej kolumny tej samej tabeli. Przy roku 2025 i marce Kelvani we fragmentatorze miara z kroku 2 pokazuje Komputery 25,82% i Akcesoria 1,29%, razem 27,11%, czyli udział marki w całym roku. Gdy pytanie brzmi „jak dzieli się sprzedaż tej marki”, zdejmij filtr tylko z kolumny kategorii: wynik to 95,24% i 4,76%, razem 100%. Ta wersja wymaga w wierszach pola Kategoria z DimProdukty. Z kolumną z DimKategorie pokazuje 100% w każdym wierszu, bo filtr wiersza przychodzi wtedy z innej tabeli.
Udział w kategoriach % =
DIVIDE (
[Łączna sprzedaż],
CALCULATE ( [Łączna sprzedaż], REMOVEFILTERS ( DimProdukty[Kategoria] ) )
)
Miarę z REMOVEFILTERS() bez argumentu zostaw tylko tam, gdzie fragmentatory mają nie zmieniać mianownika, na przykład na karcie z udziałem w całej historii sieci. W macierzy z fragmentatorem roku daje 27,1% w wierszu Suma i myli odbiorców. Tak samo działa każda miara, która w każdym wierszu pokazuje tę samą sumę całości, o czym piszemy w poście o mierze z tą samą wartością w każdym wierszu.
Gdy udział ma uwzględniać fragmentator, a mianownik CALCULATE nadpisuje wybór, bo filtruje tę samą kolumnę, sięgnij po KEEPFILTERS, opisany w poście o CALCULATE, który nadpisuje fragmentator. Ten sam dylemat ALL czy wybór użytkownika dotyczy rankingu, w którym RANKX potrzebuje listy wszystkich sklepów, co pokazujemy w poście o RANKX z jedynką w każdym wierszu.
Jak sprawdzić, że problem zniknął
Wiersz Suma to najprostszy test. Miara udziału w wyborze ma tam 100% przy każdym fragmentatorze. Miara udziału w okresie ma 100%, dopóki fragmentatory nie dotyczą tabeli produktów. Gdy suma wychodzi poniżej 100%, mianownik zdejmuje więcej filtrów, niż zakłada pytanie. Na modelu Nordvelli przy roku 2025 i dwóch kategoriach miara z ALLSELECTED daje 100%, miara z REMOVEFILTERS(DimProdukty) 51,14%, a miara z REMOVEFILTERS() z kursu 13,9%.
Na przyszłość nadaj miarom udziału nazwy, które mówią, w czym liczą udział (w okresie, w wyborze, w kategoriach), i opisz mianownik w opisie miary. Przy każdym nowym fragmentatorze na stronie sprawdź wiersz Suma.
Źródła i sposób sprawdzenia
Microsoft Learn: ALLSELECTED function (DAX) (źródło)
Microsoft Learn: REMOVEFILTERS function (DAX) (źródło)
Sprawdzone zapytaniami DAX na modelu Nordvelli: trzy mianowniki przy filtrze roku 2025, wyborze dwóch kategorii i marce Kelvani, wiersz Suma przez ROLLUPADDISSUBTOTAL.
Zachowanie programu sprawdziliśmy w Power BI Desktop 2.157 (wydanie z sierpnia 2026 r.) z polskim interfejsem, a przykłady na modelu sieci Nordvella z bezpłatnego kursu Power BI. Microsoft wydaje nową wersję Power BI Desktop co miesiąc, więc nazwy przycisków i limity usługi mogą się zmieniać. Aktualne wartości podaje dokumentacja Microsoft Learn.
Podziel miarę przez tę samą miarę w CALCULATE, który zdejmuje filtr wiersza, na przykład DIVIDE([Łączna sprzedaż], CALCULATE([Łączna sprzedaż], REMOVEFILTERS(DimProdukty))). DIVIDE chroni przed dzieleniem przez zero. Zakres zdejmowanych filtrów wybierz według pytania: udział w całości, w okresie albo w wyborze użytkownika.
Czym różni się ALL od ALLSELECTED w DAX?
ALL zdejmuje wszystkie filtry ze wskazanej tabeli albo kolumny, także te z fragmentatorów. ALLSELECTED zdejmuje tylko filtr pochodzący z wierszy wizualizacji, a zostawia wybór z fragmentatorów i filtrów. Na modelu Nordvelli przy roku 2025 i wyborze Komputerów i Telefonów ALL(DimProdukty) daje udziały 28,11% i 23,03%, a ALLSELECTED 54,97% i 45,03%.
Czy ALL i REMOVEFILTERS dają ten sam wynik?
Jako argument CALCULATE tak, obie funkcje zdejmują filtry ze wskazanej tabeli albo kolumny. REMOVEFILTERS służy tylko do czyszczenia filtrów i nie zwraca tabeli, więc nie zastąpi ALL tam, gdzie potrzebna jest lista wierszy, na przykład w RANKX. REMOVEFILTERS bez argumentu zdejmuje filtry z całego modelu.
Dlaczego udział procentowy nie sumuje się do 100% po wybraniu roku?
Mianownik zdejmuje także filtr roku, więc dzieli sprzedaż wybranego roku przez sprzedaż wszystkich lat. Tak działa REMOVEFILTERS bez argumentu. Na modelu Nordvelli w 2025 suma udziałów wynosi wtedy 27,09%. Zdejmij filtry tylko z tabeli produktów, a udziały w roku zsumują się do 100%.
Komentarze (0)
Brak komentarzy...