Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - Model danych i relacje
Relacja wiele do wielu w Power BI - kiedy jest bezpieczna, a kiedy daje złe sumy
Sprzedaż Nordvelli jest zapisana na produktach, a budżet tylko na czterech kategoriach. Przy danych na różnym poziomie szczegółowości, także przy zwrotach z kilkoma powodami naraz, Power BI pozwala połączyć tabele relacją wiele do wielu bez unikatowego klucza, ale wyniki zależą od tego, po czym grupujesz. Na budżecie Nordvelli sprawdzamy, kiedy sumy są poprawne, kiedy rosną prawie dwukrotnie i jak to zabezpieczyć.
Gdy łączysz kolumny, z których żadna nie ma unikatowych wartości, Power BI ustawia kardynalność Wiele do wielu (*:*) i pokazuje ostrzeżenie: „Ta relacja ma kardynalność wiele-do-wielu. Należy jej używać tylko wtedy, gdy oczekuje się, że żadna z kolumn (KategoriaID i KategoriaID) nie zawiera unikatowych wartości, a do tego rozumie się znacząco odmienne działanie relacji wiele-do-wielu.” Według dokumentacji Microsoft taka relacja jest ograniczona i na diagramie modelu ma za znacznikami kardynalności znaki podobne do nawiasów.
Złe sumy widać dopiero na wizualizacji. W Nordvelli budżet sprzedaży to 541 917 189,40 zł na cztery kategorie. W zapytaniu połączyliśmy FaktBudzet[KategoriaID] z DimProdukty[KategoriaID] funkcją TREATAS, czyli tak, jak łączy relacja wiele do wielu z kierunkiem od produktów do budżetu, i pokazaliśmy budżet według marki. Wyszło: Bexoria 417 775 655,38 zł, Auroneo 223 462 048,70 zł, Kelvani 194 313 606,68 zł, Zentaro 124 141 534,02 zł, Nordvella 43 584 168,09 zł. Suma tych wierszy to 1 003 277 012,87 zł, a wiersz sumy w tej samej tabeli pokazuje 541 917 189,40 zł.
Zobacz też: Szkolenie Power BI - Desktop, DAX i Online + Copilot
Relacja wiele do wielu nie ma strony jeden, więc filtr przechodzi nią jako zestaw wartości klucza. Wiersz marki Bexoria filtruje DimProdukty do jej sześciu produktów, które leżą w trzech kategoriach: Komputery (1 produkt), AGD/RTV (4) i Akcesoria (1). Do FaktBudzet trafiają więc trzy identyfikatory kategorii i cały ich budżet: 150 729 438,59 zł plus 223 462 048,70 zł plus 43 584 168,09 zł. Kategoria Akcesoria wchodzi w ten sposób do wierszy trzech marek naraz. Wiersz sumy nie ma filtra marki, więc liczy każdy budżet raz. Liczby nie są błędem silnika, tylko odpowiedzią na pytanie, którego budżet nie umie rozstrzygnąć: budżetu marki w danych nie ma.
Według dokumentacji Microsoft relacja wiele do wielu jest zawsze ograniczona: silnik łączy tabele w czasie zapytania, gubi wiersze bez dopasowania zamiast dokładać pusty wiersz, a funkcja RELATED po niej nie działa. Na liście wydajności propagacji filtrów taka kardynalność jest za relacjami jeden do wielu. Bezpieczna jest więc tam, gdzie analiza zostaje na poziomie klucza relacji, czyli kategorii. Gdy klucz wymiaru powinien być unikatowy, a nie jest, to inny problem, opisany w poście o zduplikowanych wartościach w kluczu relacji.
FaktBudzet każda kategoria ma wiele wierszy (sklepy i miesiące), w DimProdukty każda kategoria ma kilka produktów, więc wiele do wielu wynika z poziomu danych. Gdy jedna ze stron jest tabelą wymiaru z kluczem, który powinien być unikatowy, popraw dane, zamiast zostawiać tę kardynalność.DimKategorie z czterema unikatowymi wartościami KategoriaID i dwiema relacjami Wiele do jednego (*:1): z FaktBudzet i z DimProdukty. W wizualizacjach budżetu używasz DimKategorie[Kategoria]: Komputery 150 729 438,59 zł, Telefony 124 141 534,02 zł, AGD/RTV 223 462 048,70 zł, Akcesoria 43 584 168,09 zł, razem 541 917 189,40 zł. To te same liczby, które daje relacja wiele do wielu przy grupowaniu po kategorii z DimProdukty.DimProdukty do FaktBudzet. Dokumentacja Microsoft zaleca dla faktów zapisanych na wyższym poziomie właśnie taki kierunek: od tabeli wymiaru do tabeli faktów.Budżet kategorii =
IF(
NOT ISFILTERED(DimProdukty[ProduktID])
&& NOT ISFILTERED(DimProdukty[Nazwa])
&& NOT ISFILTERED(DimProdukty[Marka])
&& NOT ISFILTERED(DimProdukty[Model])
&& NOT ISFILTERED(DimProdukty[Podkategoria]),
[Budżet sprzedaży]
)FaktBudzet kolumny, które dają się sumować, na przykład BudzetSprzedazy: prawy przycisk na kolumnie w panelu Dane i Ukryj w widoku raportu. Według dokumentacji Microsoft wtedy fakty podsumowuje tylko miara, a ta ma już zabezpieczenie z kroku 4.Porównaj sumę wierszy z wierszem sumy. Na Nordvelli zapytanie z SUMX po kategoriach dało 541 917 189,40 zł, tyle samo co budżet całości, a SUMX po markach 1 003 277 012,87 zł. Gdy suma wierszy przekracza całość, a kolumna wierszy jest drobniejsza niż klucz relacji, wiersze pokazują budżety powielone i trzeba je wyłączyć miarą z kroku 4 albo grupować po wymiarze z kroku 2.
Pamiętaj też o drugiej stronie problemu: w modelu Nordvelli bez relacji wiele do wielu marka w ogóle nie filtruje budżetu i każdy wiersz pokazuje 541 917 189,40 zł. Ten objaw opisujemy w poście o mierze z tą samą wartością w każdym wierszu, a porównanie sprzedaży z budżetem na wspólnych wymiarach w poście o dwóch tabelach faktów w jednym raporcie.
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...