Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - DAX liczy, ale nie to, czego oczekujesz

CALCULATE nadpisuje wybór we fragmentatorze - KEEPFILTERS

W skrócie

  • Miara z CALCULATE i warunkiem na kolumnie, po której filtruje fragmentator, nie reaguje na zaznaczenie: na modelu Nordvelli sprzedaż Warszawy i Krakowa przy zaznaczonych Krakowie i Gdańsku dalej wynosi 273 297 861,68 zł.
  • Warunek w CALCULATE zastępuje istniejące filtry na tych samych kolumnach, a filtry na innych kolumnach zostawia. Dlatego zaznaczenie sklepu albo regionu z warunkiem na mieście się przecina, a zaznaczenie miasta jest zastępowane.
  • Owiń warunek w KEEPFILTERS, gdy miara ma respektować wybór użytkownika. Wtedy przy Krakowie i Gdańsku dostajesz 50 479 566,75 zł, czyli sam Kraków, a przy samym Gdańsku pustą wartość.

We fragmentatorze miast zaznaczasz Kraków i Gdańsk: karta Łączna sprzedaż spada do 78 334 427,94 zł, a karta obok z miarą Sprzedaż Warszawa i Kraków dalej pokazuje 273 297 861,68 zł. CALCULATE z warunkiem na kolumnie, po której odbiorca filtruje stronę, zastępuje wybór z fragmentatora własnym warunkiem. Rozróżniamy zachowanie zamierzone od błędu i sprawdzamy, jak KEEPFILTERS zmienia wynik. Wszystkie kwoty pochodzą z zapytań na modelu Nordvelli z 15 sklepami w 11 miastach.

Jak to wygląda w praktyce

Weźmy miarę Sprzedaż Warszawa i Kraków z warunkiem DimSklepy[Miasto] IN { "Warszawa", "Kraków" } w CALCULATE, czyli CALCULATE([Łączna sprzedaż], DimSklepy[Miasto] IN { "Warszawa", "Kraków" }). Na modelu Nordvelli bez żadnego filtra daje 273 297 861,68 zł, czyli 222 818 294,93 zł Warszawy (z Nordvellą Online) i 50 479 566,75 zł Krakowa. Gdy we fragmentatorze z polem DimSklepy[Miasto] zaznaczysz Kraków i Gdańsk, karta Łączna sprzedaż pokazuje 78 334 427,94 zł, a karta z miarą miast dalej 273 297 861,68 zł. Przy samym Gdańsku jest tak samo: Gdańsk ma 27 854 861,19 zł sprzedaży, a miara nadal pokazuje Warszawę i Kraków.

W macierzy z miastami w wierszach objaw wygląda jeszcze inaczej: ta sama kwota 273 297 861,68 zł pojawia się przy każdym z 11 miast, także przy Białymstoku i Lublinie. W kursie ten sam efekt widać na kategoriach produktów: przy zaznaczonych Telefonach miara Sprzedaż komputery dalej liczy komputery.

Fragmentator z zaznaczonymi Telefonami: Sprzedaż komputery dalej 130 476 190 zł, wersja z KEEPFILTERS pusta
Przykład z kursu: użytkownik wybrał Telefony, a miara bez KEEPFILTERS dalej liczy komputery. Wersja z KEEPFILTERS jest pusta, bo przecięcie Telefonów i Komputerów nie istnieje.

Dlaczego tak się dzieje

Kontekst filtra, czyli zestaw warunków z fragmentatorów, wierszy macierzy i filtrów strony, trafia do CALCULATE z zewnątrz. Według dokumentacji Microsoft argumenty filtrujące CALCULATE zastępują wszystkie istniejące filtry na tych samych kolumnach, a filtry na kolumnach, których argumenty nie wymieniają, zostają bez zmian. Warunek na DimSklepy[Miasto] usuwa więc zaznaczenie miast z fragmentatora i wstawia w jego miejsce Warszawę i Kraków. Zapis z FILTER(ALL(DimSklepy[Miasto]), ...) działa tak samo, sprawdziliśmy: przy Krakowie i Gdańsku daje 273 297 861,68 zł.

Inaczej jest, gdy fragmentator filtruje inną kolumnę. Przy zaznaczonych sklepach Nordvella Gdańsk i Nordvella Kraków Galeria, czyli filtrze na DimSklepy[Nazwa], miara miast daje 18 933 826,98 zł, sam Kraków Galeria, bo filtr na nazwie zostaje i przecina się z warunkiem. Tak samo przy regionie Południe (Kraków i Katowice) wynik to 50 479 566,75 zł. KEEPFILTERS według dokumentacji Microsoft zmienia to zachowanie: istniejący filtr na tej samej kolumnie zostaje, a do kontekstu trafia przecięcie obu warunków. Ten sam mechanizm w macierzy z jedną kwotą w każdym wierszu opisujemy też w poście o mierze z tą samą wartością w każdym wierszu.

Co zrobić krok po kroku

  1. Porównaj kolumnę fragmentatora z kolumną w warunku CALCULATE. Zaznacz fragmentator i sprawdź w obszarze Pole, jakiej kolumny używa, a potem zaznacz miarę w panelu Dane i przeczytaj formułę w pasku formuły. Gdy obie wskazują tę samą kolumnę, na przykład DimSklepy[Miasto], warunek miary zastępuje wybór użytkownika.
  2. Zdecyduj, co miara ma pokazywać. Gdy ma być stałą wartością odniesienia, na przykład sprzedażą dwóch największych miast jako punktem porównania, zostaw domyślne zastępowanie i nazwij miarę tak, żeby było widać, że nie reaguje na fragmentator. Takie stałe punkty odniesienia z ALL i REMOVEFILTERS opisujemy w poście o udziale procentowym w DAX.
  3. Gdy miara ma respektować wybór, owiń warunek w KEEPFILTERS. Prawy przycisk na FaktSprzedaz w panelu Dane, Nowa miara, i wpisz formułę poniżej. Na Nordvelli przy zaznaczonych Krakowie i Gdańsku miara zwraca 50 479 566,75 zł, czyli sam Kraków, bo tylko on jest w obu zbiorach. Przy samym Gdańsku zwraca pustą wartość, a bez zaznaczeń 273 297 861,68 zł.
    Sprzedaż Warszawa i Kraków (przecięcie) =
    CALCULATE (
        [Łączna sprzedaż],
        KEEPFILTERS ( DimSklepy[Miasto] IN { "Warszawa", "Kraków" } )
    )
  4. Ten sam wynik daje FILTER po VALUES, bo VALUES zwraca tylko miasta widoczne w bieżącym kontekście. Przy Krakowie i Gdańsku ta wersja też zwróciła 50 479 566,75 zł. Nie myl jej z FILTER po ALL, które usuwa wybór i daje 273 297 861,68 zł, jak wersja bez KEEPFILTERS.
    Sprzedaż Warszawa i Kraków (VALUES) =
    CALCULATE (
        [Łączna sprzedaż],
        FILTER ( VALUES ( DimSklepy[Miasto] ), DimSklepy[Miasto] IN { "Warszawa", "Kraków" } )
    )
  5. Sprawdź miarę w macierzy: DimSklepy[Miasto] w obszarze Wiersze, w Wartości obie wersje miary. Wersja bez KEEPFILTERS ma 273 297 861,68 zł w każdym wierszu. Wersja z KEEPFILTERS ma 222 818 294,93 zł przy Warszawie, 50 479 566,75 zł przy Krakowie, puste pola przy pozostałych miastach i 273 297 861,68 zł w wierszu Suma.
  6. Gdy fragmentator filtruje inną kolumnę, na przykład nazwę sklepu albo region, obie wersje dają to samo, bo filtry na różnych kolumnach się przecinają. Zostaw mimo to KEEPFILTERS w mierze, która ma reagować na wybór: gdy ktoś później podmieni pole fragmentatora na DimSklepy[Miasto], miara nadal będzie respektować wybór.

Jak sprawdzić, że problem zniknął

Przetestuj miarę trzema zaznaczeniami fragmentatora i porównaj z kartą Łączna sprzedaż. Bez zaznaczeń miara z KEEPFILTERS daje 273 297 861,68 zł, przy Krakowie i Gdańsku 50 479 566,75 zł, czyli mniej niż 78 334 427,94 zł łącznej sprzedaży obu miast, a przy samym Gdańsku pustą wartość. Wynik większy niż łączna sprzedaż zaznaczonych miast oznacza, że warunek w CALCULATE nadal zastępuje wybór.

Przy każdej mierze z warunkiem w CALCULATE zapisz w jej opisie, czy ma reagować na fragmentatory, i sprawdź ją z fragmentatorem po tej samej kolumnie co warunek. Gdy fragmentator nie zmienia wizualizacji z innego powodu, na przykład przez brak relacji, przeczytaj post o fragmentatorze, który nie filtruje wykresu.

Źródła i sposób sprawdzenia

  • Microsoft Learn: KEEPFILTERS function (DAX) (źródło)
  • Microsoft Learn: CALCULATE function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: miara Warszawy i Krakowa bez KEEPFILTERS, z KEEPFILTERS, z FILTER po VALUES i po ALL przy filtrach na mieście, nazwie sklepu i regionie oraz w macierzy po miastach.

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.

Wróć do listy: 131 najczęstszych pytań i problemów związanych z Power BI

Najczęściej zadawane pytania

Dlaczego CALCULATE ignoruje fragmentator w Power BI?
Warunek w CALCULATE na tej samej kolumnie, po której filtruje fragmentator, zastępuje wybór użytkownika w tej kolumnie. Miara z warunkiem na mieście liczy więc miasta wskazane w formule bez względu na zaznaczenie. Filtry na innych kolumnach, na przykład na nazwie sklepu, zostają i przecinają się z warunkiem.
Co robi KEEPFILTERS w DAX?
KEEPFILTERS sprawia, że warunek w CALCULATE nie zastępuje istniejącego filtra na tej samej kolumnie, tylko się z nim przecina. Na modelu Nordvelli miara Warszawy i Krakowa przy zaznaczonych Krakowie i Gdańsku daje z KEEPFILTERS 50 479 566,75 zł, czyli sam Kraków, a bez niego 273 297 861,68 zł.
Kiedy nie używać KEEPFILTERS?
Gdy miara ma pokazywać stałą wartość odniesienia, niezależną od wyboru użytkownika, na przykład sprzedaż wybranych miast jako punkt porównania. Wtedy domyślne zastępowanie filtra jest właściwe, a nazwa miary powinna mówić, że wynik nie reaguje na fragmentator.
Czym różni się KEEPFILTERS od FILTER z VALUES?
Dla prostego warunku na jednej kolumnie oba zapisy dają ten sam wynik, bo FILTER po VALUES bierze tylko wartości widoczne w bieżącym kontekście. Na Nordvelli obie wersje przy zaznaczonych Krakowie i Gdańsku zwróciły 50 479 566,75 zł. FILTER po ALL działa za to jak zwykły warunek i zastępuje wybór użytkownika.

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...