Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Komunikaty błędów DAX

Dzielenie przez zero w DAX - DIVIDE zamiast operatora / i wartość nieskończoności

W skrócie

  • Dzielenie przez zero w DAX operatorem ukośnika nie zgłasza błędu, tylko zwraca Nieskończoność, -Nieskończoność albo NaN, które przechodzą dalej do sortowania, sum i średnich.
  • Mianownik bywa zerem albo pustą wartością, na przykład gdy w sklepie i miesiącu nie było zwrotów. Liczba podzielona przez pustą wartość też daje Nieskończoność.
  • DIVIDE zwraca w takim przypadku pustą wartość, a z trzecim argumentem stałą, na przykład 0. QUOTIENT i MOD przy zerze kończą się błędem, więc ich mianownik trzeba sprawdzić osobno.

Słowo Nieskończoność albo NaN w tabeli to jedyny ślad, że wskaźnik podzielił coś przez zero, bo Power BI nie pokazuje przy tym żadnego komunikatu. Tak działa dzielenie przez zero w DAX zapisane operatorem ukośnika, gdy w części wierszy mianownik jest zerem lub pustą wartością, na przykład w sprzedaży na zwrot, sprzedaży na metr kwadratowy albo udziale. Rozbieramy, co dokładnie zwraca ukośnik, dlaczego psuje sumy i ranking i jak zastąpić go funkcją DIVIDE.

Jak to wygląda w praktyce

W tabeli albo macierzy zamiast liczby pojawia się Nieskończoność, -Nieskończoność albo NaN. W kursie miara Sprzedaż na zwrot ukośnikiem pokazuje Nieskończoność dla sklepu Nordvella Warszawa Centrum w październiku 2024: sklep sprzedał wtedy za 705 941,71 zł i nie przyjął ani jednego zwrotu. Ta sama miara przez DIVIDE zostawia pustą komórkę.

Na modelu Nordvelli sprawdziliśmy wszystkie przypadki zapytaniem DAX. Liczba podzielona przez zero daje Infinity, liczba ujemna przez zero -Infinity, a zero przez zero NaN. Liczba podzielona przez pustą wartość też daje Infinity, zero przez pustą wartość NaN, a pusta przez pustą zostaje pusta. Żaden z tych przypadków nie kończy się komunikatem błędu.

Nieskończoność idzie dalej. W rankingu sklepów według sprzedaży na zwrot w październiku 2024 Warszawa Centrum wychodzi na pierwsze miejsce, przed Warszawą Ursynów z 479 033,53 zł. SUMX i AVERAGEX po sklepach dają Infinity, chociaż wiersz całej sieci liczy się poprawnie: 9 894 194,40 zł sprzedaży na 58 zwrotów, czyli 170 589,56 zł na zwrot.

Tabela sklepów Nordvelli w październiku 2024: Warszawa Centrum z Nieskończonością przy ukośniku i pustą komórką przy DIVIDE
Nordvella Warszawa Centrum nie miała w październiku 2024 ani jednego zwrotu. Dzielenie ukośnikiem daje Nieskończoność, DIVIDE zostawia puste miejsce.

Dlaczego tak się dzieje

Operator ukośnika liczy jak zwykła arytmetyka liczb zmiennoprzecinkowych, w której dzielenie przez zero ma wynik nieskończony, a zero przez zero wynik nieokreślony (NaN). Pusta wartość w mianowniku działa przy tym jak zero, chyba że pusty jest też licznik. Tak działa ukośnik w każdym miejscu: w mierze, w kolumnie obliczeniowej i w iteratorze.

Pusty mianownik pojawia się częściej niż zerowy. Miara Liczba zwróconych pozycji to CALCULATE z COUNTROWS i warunkiem CzyZwrot = 1, a COUNTROWS bez wierszy zwraca pustą wartość, nie zero. Na Nordvelli 75 z 795 par sklep i miesiąc ze sprzedażą nie ma żadnego zwrotu, więc w każdej z nich ukośnik daje Nieskończoność. Zero bywa też zapisane w danych: Nordvella Online ma w DimSklepy powierzchnię 0 m2, więc jej sprzedaż na metr kwadratowy liczona ukośnikiem to Infinity. Dzielenie pustej wartości przez pustą, które nie kończy się błędem, pokazujemy w lekcji o podstawach DAX, na ocenach sklepu bez ankiet.

Kilka funkcji zachowuje się inaczej niż ukośnik. QUOTIENT i MOD przy zerowym dzielniku przerywają obliczenie komunikatem „Podczas obliczania funkcji „QUOTIENT” wystąpiło dzielenie przez zero.” (w angielskiej wersji: „Division by zero has occurred when evaluating function 'QUOTIENT'.”), a dla MOD z jej nazwą w cudzysłowie.

Co zrobić krok po kroku

  1. Znajdź wiersze z problemem. Dodaj do tabeli obok wskaźnika jego mianownik, w przykładzie Liczba zwróconych pozycji. Każdy wiersz z Nieskończonością albo NaN ma w mianowniku zero albo pustą komórkę.
  2. Zastąp ukośnik funkcją DIVIDE. Zaznacz miarę w panelu Dane i popraw formułę w pasku formuły. Bez trzeciego argumentu DIVIDE zwraca pustą wartość, gdy mianownik jest zerem albo pusty. Dla Warszawy Centrum w październiku 2024 komórka zostaje pusta, a ranking zaczyna się od Warszawy Ursynów z 479 033,53 zł.
    Sprzedaż na zwrot przez DIVIDE =
    DIVIDE([Łączna sprzedaż], [Liczba zwróconych pozycji])
  3. Gdy wskaźnik ma zawsze pokazywać liczbę, podaj trzeci argument. Dla Warszawy Centrum w październiku 2024 ta wersja zwraca 0. Według dokumentacji Microsoft w miarach zwykle lepsza jest pusta wartość, bo wizualizacje domyślnie pomijają grupy z pustym wynikiem i pokazują tylko te, w których są dane.
    Sprzedaż na zwrot lub zero =
    DIVIDE([Łączna sprzedaż], [Liczba zwróconych pozycji], 0)
  4. Trzeci argument musi być stałą. DIVIDE(1, 0, [Łączna sprzedaż]) i nawet DIVIDE(1, 0, 2 + 3) skończyły się komunikatem „Alternatywny wynik, który ma być zwracany w przypadku dzielenia przez zero, musi być stałą wartością liczbową.” (w angielskiej wersji: „The alternate result to return on divide by zero cases must be a constant numeric value.”). Zmienna z liczbą przeszła: VAR alt = 5 i DIVIDE(1, 0, alt) dało 5.
  5. Popraw też kolumny obliczeniowe. Kolumna z ukośnikiem zapisuje Nieskończoność w wierszu, a potem MAX, SUM i AVERAGE całej kolumny też zwracają Infinity. Na Nordvelli tak wyszło dla sprzedaży na metr kwadratowy przez wiersz Nordvella Online. Wersja z DIVIDE zostawia tam pustą wartość.
    Sprzedaż na m2 =
    DIVIDE(DimSklepy[Sprzedaż sklepu], DimSklepy[Powierzchnia_m2])
  6. Przy QUOTIENT i MOD sprawdź dzielnik przed wywołaniem, bo te funkcje nie mają argumentu zastępczego. Na Nordvelli miara z QUOTIENT przez powierzchnię sklepów zatrzymała całe zapytanie tabeli sklepów komunikatem o dzieleniu przez zero, przez jeden wiersz Nordvella Online. Wzorzec poniżej sprawdziliśmy jako miarę w tabeli sklepów: Nordvella Online dostała pustą wartość, a pozostałe 14 sklepów wynik w pełnych złotych, na przykład 40 871 zł na m2 dla Warszawy Centrum. Porównanie = 0 łapie też pustą wartość. IFERROR też działa z ukośnikiem: IFERROR(1/0, -1) dało -1, ale według dokumentacji Microsoft DIVIDE jest krótsze i lepiej zoptymalizowane niż sprawdzanie mianownika warunkiem.
    Sprzedaż na m2 w pełnych złotych =
    VAR Dzielnik = SUM(DimSklepy[Powierzchnia_m2])
    RETURN
        IF(Dzielnik = 0, BLANK(), QUOTIENT([Łączna sprzedaż], Dzielnik))
  7. Nie próbuj ukrywać Nieskończoności formatem. Ciąg formatu nie zmienia wartości: FORMAT(1/0, "#,0.00") zwrócił tekst „inf”, a FORMAT(0/0, "#,0.00") tekst „-nan(ind)”. Poprawka musi być w formule, nie w wyglądzie liczby. Jak świadomie pokazać zero zamiast pustej komórki, opisujemy w poście o pustej wartości zamiast zera w tabeli.

Jak sprawdzić, że problem zniknął

Po zmianie sprawdź trzy rzeczy na tym samym filtrze. W tabeli nie ma już słowa Nieskończoność ani NaN. Ranking nie zaczyna się od wiersza z pustym mianownikiem: na Nordvelli pierwsza jest Warszawa Ursynów z 479 033,53 zł. Sumy i średnie po wierszach są skończone: SUMX po sklepach z DIVIDE daje 2 941 534,99 zł, a AVERAGEX 210 109,64 zł z 14 sklepów, bo sklep z pustą wartością nie wchodzi do średniej. Dlaczego wiersz Suma nie musi być sumą wierszy, wyjaśniamy w poście o wierszu Suma, który nie zgadza się z sumą wierszy.

Dziel przez DIVIDE wszędzie tam, gdzie mianownik jest miarą albo kolumną. Ukośnik zostaw dla stałych różnych od zera, na przykład przy dzieleniu przez 1000. Takie zalecenie podaje także dokumentacja Microsoft.

Źródła i sposób sprawdzenia

  • Microsoft Learn: DIVIDE function (DAX) (źródło)
  • Microsoft Learn: DIVIDE function vs. divide operator (/) in DAX (źródło)
  • Microsoft Learn: DAX operators (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: wyniki ukośnika i DIVIDE dla zera i pustej wartości, Warszawa Centrum w październiku 2024, ranking, SUMX, AVERAGEX, QUOTIENT, MOD i FORMAT.

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

Co zwraca dzielenie przez zero w DAX?
Operator ukośnika nie zgłasza błędu. Liczba dodatnia podzielona przez zero daje Nieskończoność, ujemna -Nieskończoność, a zero przez zero NaN. Liczba podzielona przez pustą wartość także daje Nieskończoność, a pusta przez pustą zostaje pusta.
Jak w DAX dzielić bez błędu przy zerowym mianowniku?
Użyj funkcji DIVIDE zamiast ukośnika. DIVIDE(licznik, mianownik) zwraca pustą wartość, gdy mianownik jest zerem albo pusty, a DIVIDE(licznik, mianownik, 0) zwraca wtedy zero. Ukośnik zostaw dla stałych różnych od zera.
Czy trzeci argument DIVIDE może być miarą?
Nie. Wynik zastępczy musi być stałą liczbową, a miara albo wyrażenie typu 2 + 3 kończy się komunikatem, że alternatywny wynik musi być stałą wartością liczbową. Przeszła zmienna z liczbą, na przykład VAR alt = 5.
Dlaczego Nieskończoność psuje sumy i ranking w Power BI?
W rankingu malejącym Nieskończoność wyprzedza każdą liczbę, więc trafia na pierwsze miejsce, a SUMX i AVERAGEX po wierszach z taką wartością też zwracają nieskończoność. Na modelu Nordvelli sklep bez zwrotów wyprzedził w rankingu wszystkie pozostałe.

Komentarze (0)

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

Brak komentarzy...