Języki M i DAX różnią się w wielu miejscach od standardowych kalkulacji znanych z programu Excel. Jeśli chcemy nimi operować, warto wiedzieć, jak zachowają się w ekstremalnych sytuacjach, np. takich, które podnoszą ciśnienie szkolnych matematyków, krzyczących: „Pamiętaj, cholero, nie dziel przez zero.” 😉
Jakie operacje będziemy testować w Power Query i Power Pivot?
Sprawdzimy w różnych kombinacjach operację dzielenia i dodawania z wykorzystaniem zera, null w Power Query / BLANK() w Power Pivot, tekstu.
Wyniki i wnioski dla użytkowników języka M w Power Query (Excel i Power BI)
Wnioski
- Każda operacja z tekstem daje błąd,
- Każda operacja z nullem (oprócz przypadków z punktu wyżej) daje null, np. 0/null, null/0, ale też 1+null i 0+null – to najbardziej praktyczny i najważniejszy wniosek, bo może doprowadzić do błędnych wyników przy kalkulacjach na kolumnach,
- Dzielenie 0/0 nie daje liczby (NaN = Not a Number) – Pani od matematyki miała rację mówiąc, że się nie da,
- Dzielenie 1/0 daje nieskończoność (Infinity) – tu Pani do matmy powiedziałaby: „Nieskończoność? Prędzej mi tu na ręku kaktus wyrośnie”.
Wyniki i wnioski dla użytkowników języka DAX w Excel Power Pivot i Power BI
Wnioski
- Każda operacja z tekstem daje błąd,
- 0/BLANK() i 1/BLANK() daje nieskończoność – inaczej niż w Power Query, natomiast BLANK()/0 daje, podobnie jak w PQ, pusty,
- Dodawanie BLANK() działa bardziej intuicyjnie niż w Power Query, np. 1 + BLANK() = 1,
- Dzielenie przez 0 będzie niebezpieczne dla naszych miar, więc rekomendowane jest użycie formuły DIVIDE.
Pobierz plik Excel z testem kalkulacji
Tu możesz pobrać nasz testowy plik Excel z zapytaniem w Power Query i miarami w Power Pivot.
Masz inne spostrzeżenia?
Podziel się w komentarzu.
Bartosz, jak sobie poradzić z dzieleniem przez zero w języku M?
Jak wygląda taka formuła, która jest odpowiednikiem JEŻELI.BŁĄD w xls lub DIVIDE w DAX?
Chciałabym, aby w kolumnie wynikowej zamiast NaN pojawiło się 0, null lub określony tekst, np. „brak danych”.
Dziękuje z góry za pomoc.
Hej Ula, do testowania błędów można użyć try, a do NaN lub infinity proponuję zmodyfikować lekko formuły dla kolumny warunkowej:
= if [Dzielenie] = #infinity then „a” else if Number.IsNaN([Dzielenie]) then „b” else „c”)