Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - DAX liczy, ale nie to, czego oczekujesz
RANKX daje 1 w każdym wierszu albo dziwne miejsca w rankingu
Piętnaście sklepów, od Nordvelli Online ze 141 772 848,59 zł do Białegostoku z 12 259 226,35 zł, i w każdym wierszu ta sama pozycja: 1. Taki wynik daje RANKX w pierwszej wersji rankingu, a gdy ranking już działa, pojawiają się kolejne zagadki: pozycje zaczynają się od 1 po wybraniu regionu, sklepy bez sprzedaży dostają miejsce, a po remisie brakuje numeru. Na modelu Nordvelli rozkładamy każdy z tych wyników na przyczyny i budujemy ranking, który odpowiada na pytanie zarządu.
W macierzy z polem DimSklepy[Nazwa] w wierszach, miarą [Łączna sprzedaż] i miarą Ranking sklepu (bez ALL) = RANKX(VALUES(DimSklepy[Nazwa]), [Łączna sprzedaż]) każdy z 15 sklepów Nordvelli ma pozycję 1, od Nordvelli Online ze 141 772 848,59 zł do Białegostoku z 12 259 226,35 zł. Ten sam efekt daje RANKX(ALL(DimSklepy[Nazwa]), SUM(FaktSprzedaz[WartoscNetto])), czyli wyrażenie bez miary. Wiersz Suma w pierwszej wersji też pokazuje 1.
Poprawny ranking potrafi z kolei pokazywać dziwne miejsca. Po wybraniu regionu Centrum we fragmentatorze Nordvella Warszawa Centrum jest pierwsza, choć w całej sieci zajmuje drugie miejsce. W tabeli miast Katowice, Wrocław i pozostałe miasta z jednym sklepem mają 1, a Warszawa i Kraków puste komórki. Przy filtrze na 2 stycznia 2025 i kategorię Komputery tabela pokazuje 15 sklepów, choć sprzedaż miało 8, a siedem pozostałych dostaje wspólne miejsce 9.

Zobacz też: Szkolenie Zaawansowany DAX w Power BI
RANKX iteruje po tabeli z pierwszego argumentu, dla każdego jej wiersza liczy wyrażenie i porównuje wynik z wartością bieżącego wiersza wizualizacji. W wierszu macierzy filtr zostawia jeden sklep, więc VALUES(DimSklepy[Nazwa]) zwraca listę z jedną pozycją i sklep porównuje się sam ze sobą. ALL zdejmuje filtr tylko z podanej kolumny. Filtry na innych kolumnach tej samej tabeli, na przykład Region z fragmentatora albo Miasto z wierszy wizualizacji, zostają, więc sklepy spoza regionu czy miasta mają w środku RANKX pustą sprzedaż. Według dokumentacji Microsoft RANKX traktuje wartość pustą jak zero, dlatego te sklepy lądują na końcu listy. Ten sam mechanizm daje wspólne miejsce sklepom bez sprzedaży.
Wyrażenie musi zmieniać się razem z wierszem tabeli rankingu. Miara, na przykład [Łączna sprzedaż], wykonuje przejście kontekstu, czyli zamienia wiersz iteracji na filtr. Goła SUM(FaktSprzedaz[WartoscNetto]) tego nie robi i dla każdego sklepu z listy liczy tę samą kwotę, więc wszystkie remisują na pozycji 1. W wierszu Suma wartość całej sieci jest większa od wyniku każdego sklepu, a według dokumentacji RANKX dokłada taką wartość tymczasowo do listy, więc też dostaje 1. Różnicę między ALL i ALLSELECTED opisujemy w poście o udziale procentowym z ALL, ALLSELECTED i REMOVEFILTERS.
Ranking sklepu =
IF (
HASONEVALUE ( DimSklepy[Nazwa] ),
RANKX (
ALL ( DimSklepy[Nazwa] ),
[Łączna sprzedaż],
,
DESC,
DENSE
)
)RANKX(ALL(DimSklepy[Nazwa]), CALCULATE(SUM(FaktSprzedaz[WartoscNetto]))) daje te same pozycje od 1 do 15, a ta sama formuła bez CALCULATE daje 1 przy każdym sklepie.Ranking miasta =
IF (
HASONEVALUE ( DimSklepy[Miasto] ),
RANKX ( ALL ( DimSklepy[Miasto] ), [Łączna sprzedaż], , DESC, DENSE )
)ALL(DimSklepy[Nazwa]) dostajesz miejsce w wybranym regionie: dla Centrum Warszawa Centrum ma 1, Mokotów 2, Ursynów 3, Łódź 4. Ten sam wynik, zapisany wprost, daje ALLSELECTED. Gdy zarząd chce widzieć miejsce w całej sieci także po wybraniu regionu, użyj ALL(DimSklepy): te same sklepy mają wtedy 2, 7, 9 i 10. Filtr z innej tabeli, na przykład rok, działa w obu wersjach tak samo, a ranking przelicza się na sprzedaży z wybranego roku.Ranking sklepu w sieci =
IF (
HASONEVALUE ( DimSklepy[Nazwa] ),
RANKX ( ALL ( DimSklepy ), [Łączna sprzedaż], , DESC, DENSE )
)NOT ISBLANK([Łączna sprzedaż]), a miara zwróci wartość pustą dla sklepu bez sprzedaży i wizualizacja go ukryje. Dla 2 stycznia 2025 i kategorii Komputery tabela pokazuje wtedy 8 sklepów z pozycjami od 1 do 8 zamiast 15 wierszy, w tym siedmiu z pustą sprzedażą na miejscu 9.Ranking sklepu ze sprzedażą =
IF (
HASONEVALUE ( DimSklepy[Nazwa] ) && NOT ISBLANK ( [Łączna sprzedaż] ),
RANKX ( ALL ( DimSklepy[Nazwa] ), [Łączna sprzedaż], , DESC, DENSE )
)Kliknij nagłówek kolumny rankingu w tabeli, żeby posortować po niej, tak żeby pozycja 1 była na górze. Sprzedaż ma wtedy maleć z wiersza na wiersz, a numery przy DENSE iść bez przeskoków i bez powtórzeń poza prawdziwymi remisami. Na modelu Nordvelli sklepy idą od 1 do 15, a wiersz Suma jest pusty. Sprawdź ranking w trzech kontekstach: bez fragmentatora, z jednym regionem i z jednym dniem, w którym część sklepów nie sprzedawała. Gdy w którymś pojawia się 1 we wszystkich wierszach albo wspólne miejsce dla pustych wierszy, wróć do kroków 1, 2 i 6.
Zapisuj w nazwie miary, w jakim zbiorze liczysz miejsce (w regionie, w sieci), i trzymaj jedną miarę rankingu na jedną kolumnę wierszy. Gdy ranking ma posłużyć do wybrania najlepszych pozycji, prostszy bywa filtr albo miara z TOPN, opisane w poście o Top N produktów. Gdy miara pokazuje tę samą wartość we wszystkich wierszach także poza rankingiem, przyczyny zebraliśmy w poście o mierze z tą samą wartością w każdym wierszu.
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
Komentarze (0)
Brak komentarzy...