Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - DAX liczy, ale nie to, czego oczekujesz
Liczba unikatowych klientów w Power BI - DISTINCTCOUNT i puste wartości
Dlaczego liczba unikatowych klientów w Power BI wychodzi o jeden większa niż w eksporcie do Excela? Bo transakcje bez numeru klienta DISTINCTCOUNT liczy jako jednego dodatkowego klienta, a to dopiero pierwszy z trzech objawów. Pozostałe dwa to wiersz Suma, który nie jest sumą wierszy, i miara z tą samą wartością przy każdym sklepie. W modelu Nordvelli nie ma tabeli klientów, więc każdy z tych przypadków odtwarzamy na kolumnach, które zachowują się tak samo, i pokazujemy wzorzec miary do przeniesienia na klucz klienta.
Pierwszy objaw to wynik o jeden za duży. W tabeli DimProdukty kolumna AktywnyDo ma trzy różne daty wycofania i 27 pustych komórek przy produktach aktywnych. DISTINCTCOUNT(DimProdukty[AktywnyDo]) zwraca 4. Tak samo transakcje bez numeru klienta, na przykład zakupy bez karty, liczą się jako jeden dodatkowy klient. W kolumnie testowej IF(FaktSprzedaz[KanalSprzedazy] = "Online", BLANK(), FaktSprzedaz[KanalSprzedazy]), w której wszystkie 32 737 transakcji Online mają wartość pustą, DISTINCTCOUNT pokazuje dla kanału Online 1 zamiast pustej komórki.
Drugi objaw to wiersz Suma. W macierzy miesięcy 2025 dla sklepu Nordvella Białystok liczba sprzedanych produktów w miesiącach sumuje się do 312, a wiersz Suma pokazuje 30. Trzeci objaw to miara, która nie reaguje na filtry: Białystok w styczniu 2025 miał 59 transakcji z 27 różnymi produktami, a DISTINCTCOUNT(DimProdukty[ProduktID]) pokazuje 30.
Według dokumentacji Microsoft DISTINCTCOUNT liczy wartość pustą (BLANK), a DISTINCTCOUNTNOBLANK ją pomija. Na AktywnyDo druga funkcja daje 3. Pusty tekst to jednak co innego niż BLANK. W drugiej kolumnie testowej transakcje Online mają zamiast BLANK() tekst pusty "". COUNTBLANK uznaje za puste wszystkie 32 737 takich wierszy, a DISTINCTCOUNTNOBLANK nadal liczy trzy wartości: Stacjonarne, Telefon i pusty tekst. Taki tekst trafia do modelu z plików i baz, w których brak numeru zapisano jako pusty ciąg znaków.
Wiersz Suma liczy unikatowe wartości w całym okresie, więc produkt sprzedany w dwunastu miesiącach liczy się raz, a nie dwanaście razy. To poprawny wynik, tylko na inne pytanie niż suma miesięcy. Z kolei filtr z DimSklepy i DimKalendarz płynie przez relacje do FaktSprzedaz, ale nie dalej, do innej tabeli wymiaru, więc DimProdukty widzi wszystkie 30 produktów. Kierunek filtrowania relacji opisujemy w lekcji o modelu gwiazdy i relacjach. Według dokumentacji VALUES może też dodać wiersz pusty, gdy w faktach są klucze bez dopasowania w wymiarze, o czym piszemy w poście o pustej wartości we fragmentatorze po relacji. Na modelu Nordvelli takich kluczy nie ma.
Zobacz też: Szkolenie Zaawansowany DAX w Power BI
DimProdukty[AktywnyDo] dostajemy 27 pustych, 4 wartości z DISTINCTCOUNT i 3 z DISTINCTCOUNTNOBLANK. Gdy dwie ostatnie liczby się różnią, w kolumnie jest BLANK. Gdy są równe, a COUNTBLANK pokazuje wiele pustych, w kolumnie jest pusty tekst.EVALUATE
ROW (
"Puste", COUNTBLANK ( DimProdukty[AktywnyDo] ),
"DISTINCTCOUNT", DISTINCTCOUNT ( DimProdukty[AktywnyDo] ),
"DISTINCTCOUNTNOBLANK", DISTINCTCOUNTNOBLANK ( DimProdukty[AktywnyDo] )
)CALCULATE(DISTINCTCOUNT(DimProdukty[ProduktID]), FaktSprzedaz) dla 2 stycznia też daje 2.Liczba klientów = DISTINCTCOUNTNOBLANK ( FaktSprzedaz[KlientID] )
<> "" odrzuca oba rodzaje pustych. W kolumnie testowej miara obok daje 2, a wersja z NOT ISBLANK nadal 3, bo ISBLANK nie uznaje pustego tekstu za BLANK. Trwała poprawka to zamiana pustego tekstu na null w Power Query, opisana w poście o pustych wartościach, pustym tekście i spacjach w Power Query.Liczba klientów =
CALCULATE (
DISTINCTCOUNT ( FaktSprzedaz[KlientID] ),
FaktSprzedaz[KlientID] <> ""
)Klienci suma miesięcy =
SUMX (
VALUES ( DimKalendarz[RokMiesiac] ),
CALCULATE ( DISTINCTCOUNTNOBLANK ( FaktSprzedaz[KlientID] ) )
)[Liczba sklepów] z kursu: DISTINCTCOUNT(FaktSprzedaz[SklepID]), na modelu Nordvelli 15 w każdym roku.Wstaw tabelę z kolumną klucza i miarą liczby wierszy i poszukaj pozycji (Puste): to wiersz, który DISTINCTCOUNT liczy jako dodatkową wartość. Porównaj też trzy liczby: DISTINCTCOUNT, DISTINCTCOUNTNOBLANK i wersję z warunkiem na pusty tekst. Na kolumnie testowej z pustym tekstem dają 3, 3 i 2, a na kolumnie z prawdziwym BLANK 3, 2 i 2. Gdy wszystkie trzy są równe, kolumna nie ma pustych kluczy.
Ustal w Power Query jeden zapis braku klucza (null, a nie pusty tekst ani spacja) i liczbę klientów zawsze licz z tabeli faktów. Sprawdź ją na jednym dniu albo jednym sklepie, dla którego znasz wynik z systemu źródłowego: na modelu Nordvelli 59 transakcji ze stycznia 2025 w Białymstoku to 27 produktów, a nie 30.
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...