Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - Model danych i relacje
Pusta wartość w fragmentatorze po relacji - wiersze faktów bez dopasowania w wymiarze
Pusta wartość we fragmentatorze Power BI zaskakuje zwykle po odświeżeniu danych: lista sklepów albo produktów ma nagle pozycję (Puste), choć w tabeli wymiaru nie ma pustego wiersza. Trafia na to autor raportu, gdy system źródłowy dopisał do sprzedaży kod, którego słownik jeszcze nie zna. Pokazujemy, skąd bierze się ta pozycja, jak policzyć niedopasowane wiersze na modelu Nordvelli i jak naprawić dane, żeby kwota wróciła pod właściwą nazwę.
We fragmentatorze, na osi wykresu albo w wierszach macierzy pojawia się pozycja (Puste) z kwotą, a suma pozostałych pozycji jest mniejsza od sumy całości właśnie o tę kwotę. Filtr na pustą wartość w widoku tabeli wymiaru niczego nie znajduje, bo tego wiersza nie ma w danych wymiaru.
Na modelu Nordvelli takiej pozycji nie ma: miary Sieroty produktow, Sieroty sklepow i Sieroty dat z lekcji o modelu danych zwracają 0, a ten sam test dla zwrotów, budżetu i ankiet też daje 0. Żeby pokazać skalę zjawiska, policzyliśmy, co by się stało, gdyby z DimSklepy wypadł wiersz sklepu Nordvella Online, na przykład przez filtr w zapytaniu wymiaru. Pod pozycję (Puste) trafiłoby 32 737 transakcji za 141 772 848,59 zł, czyli ponad 30 procent sprzedaży sieci.
Według dokumentacji Microsoft relacja zwykła rozszerza tabelę po stronie wiele o kolumny strony jeden tak jak złączenie lewostronne. Gdy wartość klucza po stronie wiele nie ma pary po stronie jeden, silnik dodaje do tabeli wymiaru pusty wiersz wirtualny. Dokumentacja nazywa go nieznanym elementem (ang. unknown member) i wiąże wprost z naruszeniem integralności referencyjnej, czyli kluczem bez odpowiednika w wymiarze. Fragmentator pokazuje ten wiersz jako (Puste).
Typowe przyczyny to nowy kod w faktach, którego nie ma jeszcze w słowniku, ten sam kod zapisany inaczej po obu stronach (z zerami wiodącymi w jednej tabeli i bez nich w drugiej) oraz filtr w zapytaniu wymiaru, który usuwa pozycje nadal używane w faktach. Zera wiodące opisujemy w poście Power Query obcina zera wiodące w kodach. Funkcja VALUES zwraca pusty wiersz, a DISTINCT go pomija, co potwierdza dokumentacja funkcji VALUES. To przydaje się przy sprawdzaniu modelu.
Zobacz też: Szkolenie Power BI - Desktop, DAX i Online + Copilot
RELATED zwraca pustą wartość, gdy wiersz faktów nie ma pary w wymiarze, a końcowe + 0 zamienia pusty wynik na zero. Dodaj ją w tabeli faktów przez Nowa miara i wstaw na kartę. Na Nordvelli wynik to 0. Taką miarę zrób dla każdego klucza każdej tabeli faktów.Sieroty produktow =
COUNTROWS(
FILTER(
FaktSprzedaz,
ISBLANK(RELATED(DimProdukty[ProduktID]))
)
) + 0EXCEPT zwraca wartości z pierwszej tabeli, których nie ma w drugiej. Na Nordvelli zapytanie zwraca pustą tabelę, czyli każdy SklepID ze sprzedaży ma swój sklep.EVALUATE EXCEPT(VALUES(FaktSprzedaz[SklepID]), VALUES(DimSklepy[SklepID]))
EXCEPT zwraca 15, a do brakującego klucza należy 32 737 transakcji za 141 772 848,59 zł. Tyle samo pokazałaby pozycja (Puste) we fragmentatorze sklepów.EVALUATE
VAR WymiarBezOnline =
SELECTCOLUMNS(FILTER(DimSklepy, DimSklepy[SklepID] <> 15), "SklepID", DimSklepy[SklepID])
VAR Brakujace = EXCEPT(VALUES(FaktSprzedaz[SklepID]), WymiarBezOnline)
RETURN
ROW(
"Brakujące klucze", CONCATENATEX(Brakujace, [SklepID], ", "),
"Transakcje", COUNTROWS(FILTER(FaktSprzedaz, FaktSprzedaz[SklepID] IN Brakujace)),
"Wartość", SUMX(FILTER(FaktSprzedaz, FaktSprzedaz[SklepID] IN Brakujace), FaktSprzedaz[WartoscNetto])
)Nazwa produktu = RELATED(DimProdukty[Nazwa]). W nagłówku nowej kolumny kliknij strzałkę, odznacz (Zaznacz wszystko), zaznacz (Puste) i kliknij OK. Zostaną transakcje bez produktu w wymiarze. Potem usuń kolumnę: prawy przycisk w panelu Dane i Usuń z modelu.Po poprawce miary sierot znowu pokazują 0, a zapytanie z kroku 2 zwraca pustą tabelę. Drugi test porównuje VALUES i DISTINCT na kolumnie wymiaru. Na Nordvelli obie funkcje zwracają 15 sklepów, a sprzedaż pustego elementu jest pusta. Gdy VALUES zwraca o jedną pozycję więcej niż DISTINCT, model nadal ma pusty wiersz.
EVALUATE
ROW(
"VALUES", COUNTROWS(VALUES(DimSklepy[Nazwa])),
"DISTINCT", COUNTROWS(DISTINCT(DimSklepy[Nazwa])),
"Sprzedaż pustego elementu",
CALCULATE([Łączna sprzedaż], FILTER(VALUES(DimSklepy[SklepID]), ISBLANK(DimSklepy[SklepID])))
)Trzymaj w raporcie stronę kontrolną z kartami sierot dla każdego wymiaru, tak jak w lekcji o modelu danych, i oglądaj ją po każdym odświeżeniu. Jeśli fragmentator pokazuje pozycje bez danych, a nie (Puste), przyczyna jest inna i opisujemy ją w poście fragmentator pokazuje wartości bez danych.

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...