Blog JSystems - uwalniamy wiedzę!

Szukaj

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

Liczba unikatowych klientów w Power BI - DISTINCTCOUNT i puste wartości

W skrócie

  • Liczba unikatowych klientów z DISTINCTCOUNT w Power BI bywa o jeden za duża, nie sumuje się w wierszu Suma albo w ogóle nie reaguje na filtr sklepu i daty.
  • DISTINCTCOUNT liczy wartość pustą jako osobną wartość, DISTINCTCOUNTNOBLANK pomija ją, ale nie pomija pustego tekstu, a kolumna z tabeli wymiaru nie jest filtrowana przez inne wymiary.
  • Licz klientów z kolumny klucza w tabeli faktów, użyj DISTINCTCOUNTNOBLANK albo warunku na pusty tekst i zdecyduj, czy wiersz Suma ma pokazywać unikatowych klientów, czy sumę z miesięcy.

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.

Jak to wygląda w praktyce

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.

Dlaczego tak się dzieje

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.

Co zrobić krok po kroku

  1. Sprawdź, czy kolumna ma puste wartości i pusty tekst. W widoku zapytań w języku DAX uruchom zapytanie obok dla swojej kolumny. Na 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] )
    )
  2. Licz klientów z kolumny klucza w tabeli faktów, a nie z tabeli klientów. W panelu Dane kliknij prawym przyciskiem tabelę faktów, wybierz Nowa miara i wpisz wzorzec obok, z nazwami swojej tabeli i kolumny (w Nordvelli nie ma kolumny klienta, więc to wzorzec do dostosowania). Ten sam sposób na produktach daje dla Białegostoku w styczniu 2025 wynik 27 zamiast 30 z tabeli wymiaru, a dla 2 stycznia 2025, gdy były dwie transakcje, wynik 2. Gdy liczona kolumna jest tylko w wymiarze, owiń liczenie w CALCULATE z tabelą faktów jako filtrem: CALCULATE(DISTINCTCOUNT(DimProdukty[ProduktID]), FaktSprzedaz) dla 2 stycznia też daje 2.
    Liczba klientów =
    DISTINCTCOUNTNOBLANK ( FaktSprzedaz[KlientID] )
  3. Zdecyduj, co znaczy pusty klucz. Gdy transakcja bez numeru klienta to zakup anonimowy, nie licz go jako klienta i zostaw DISTINCTCOUNTNOBLANK. Gdy chcesz wiedzieć, ile takich transakcji jest, policz je osobną miarą z COUNTBLANK, zamiast doliczać jednego klienta. W kolumnie testowej kanał Online z samymi pustymi kluczami daje z DISTINCTCOUNT 1, a z DISTINCTCOUNTNOBLANK pustą komórkę.
  4. Gdy w kolumnie jest pusty tekst, dodaj warunek w CALCULATE. W DAX porównanie z pustym tekstem obejmuje także BLANK, więc warunek <> "" 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] <> ""
    )
  5. Ustal, co ma pokazywać wiersz Suma. Liczba unikatowych klientów w roku to wynik DISTINCTCOUNT bez zmian: dla Białegostoku w 2025 roku 30 produktów. Gdy potrzebujesz sumy miesięcznych liczb, na przykład do porównania z raportem, który sumuje miesiące, dodaj osobną miarę z SUMX po miesiącach. Na produktach Białegostoku daje 312. Inne przyczyny rozjazdu wiersza Suma opisujemy w poście o sumie, która nie zgadza się z sumą wierszy.
    Klienci suma miesięcy =
    SUMX (
        VALUES ( DimKalendarz[RokMiesiac] ),
        CALCULATE ( DISTINCTCOUNTNOBLANK ( FaktSprzedaz[KlientID] ) )
    )
  6. Zastąp podsumowanie z menu pola miarą. Podsumowanie Liczba (wartość odrębna) w menu pola wizualizacji liczy różne wartości pola, a wśród podsumowań tego menu nie ma wariantu, który pomija wartość pustą. Miara z kroku 2 ma nazwę, format i jedną definicję dla wszystkich wizualizacji. Tak zbudowana jest miara [Liczba sklepów] z kursu: DISTINCTCOUNT(FaktSprzedaz[SklepID]), na modelu Nordvelli 15 w każdym roku.

Jak sprawdzić, że problem zniknął

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.

Źródła i sposób sprawdzenia

  • Microsoft Learn: DISTINCTCOUNT function (DAX) (źródło)
  • Microsoft Learn: DISTINCTCOUNTNOBLANK function (DAX) (źródło)
  • Microsoft Learn: COUNTBLANK function (DAX) (źródło)
  • Microsoft Learn: VALUES function (DAX) (źródło)
  • Microsoft Learn: DAX operators (porównania z BLANK i pustym tekstem) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: puste wartości w AktywnyDo, kolumny testowe z BLANK i pustym tekstem, liczenie z wymiaru i z faktów, wiersz Suma.

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

Czy DISTINCTCOUNT liczy puste wartości?
Tak, DISTINCTCOUNT liczy wartość pustą jako jedną dodatkową wartość, a DISTINCTCOUNTNOBLANK ją pomija. Na modelu Nordvelli kolumna AktywnyDo z trzema datami i 27 pustymi komórkami daje 4 z DISTINCTCOUNT i 3 z DISTINCTCOUNTNOBLANK. Przy liczeniu klientów pusty numer klienta liczy się więc jako jeden klient.
Jak policzyć liczbę unikatowych klientów w Power BI?
Użyj DISTINCTCOUNTNOBLANK na kolumnie klucza klienta w tabeli faktów, a nie na kolumnie w tabeli klientów. Tabela wymiaru nie jest filtrowana przez inne wymiary, więc pokazuje wszystkich klientów niezależnie od sklepu i daty. Na modelu Nordvelli ten sam błąd na produktach daje 30 zamiast 27 produktów sprzedanych w jednym sklepie w styczniu 2025.
Dlaczego liczba unikatowych klientów w wierszu Suma jest mniejsza od sumy wierszy?
Wiersz Suma liczy unikatowe wartości w całym okresie, więc klient kupujący w kilku miesiącach liczy się raz. To poprawny wynik dla pytania o liczbę klientów w roku. Gdy potrzebna jest suma miesięcznych liczb, dodaj osobną miarę z SUMX po miesiącach, która na produktach jednego sklepu Nordvelli w 2025 roku daje 312 zamiast 30.
Dlaczego DISTINCTCOUNTNOBLANK liczy pusty tekst?
Pusty tekst nie jest wartością BLANK, więc DISTINCTCOUNTNOBLANK traktuje go jak zwykłą wartość, choć COUNTBLANK uznaje go za pusty. W kolumnie testowej na modelu Nordvelli DISTINCTCOUNTNOBLANK dał 3 zamiast 2. Pomaga warunek różny od pustego tekstu w CALCULATE albo zamiana pustego tekstu na null w Power Query.

Komentarze (0)

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

Brak komentarzy...