Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Model danych i relacje

Relacja wiele do wielu w Power BI - kiedy jest bezpieczna, a kiedy daje złe sumy

W skrócie

  • Relacja wiele do wielu w Power BI łączy dwie kolumny, z których żadna nie ma unikatowych wartości, na przykład budżet zapisany na poziomie kategorii z tabelą produktów.
  • Filtr przechodzi taką relacją jako lista wartości klucza. Gdy grupujesz po kolumnie drobniejszej niż klucz, jak marka, każdy wiersz dostaje budżet całych kategorii, a suma wierszy przestaje się zgadzać z sumą całości.
  • Grupuj po kolumnie z poziomu relacji albo dodaj wymiar kategorii z relacjami jeden do wielu, a miarę zabezpiecz funkcją ISFILTERED. Na modelu Nordvelli suma marek wyszła 1 003 277 012,87 zł przy budżecie 541 917 189,40 zł.

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

Jak to wygląda w praktyce

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

Dlaczego tak się dzieje

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.

Co zrobić krok po kroku

  1. Ustal, czy duplikaty po obu stronach są zamierzone. W 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ść.
  2. Najpierw rozważ wymiar na poziomie budżetu. Nordvella ma tabelę 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.
  3. Gdy zostajesz przy relacji wiele do wielu, ustaw w polu Kierunek filtrowania krzyżowego kierunek pojedynczy, od 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.
  4. Zabezpiecz miarę budżetu, żeby zwracała pustą wartość, gdy wizualizacja filtruje kolumny drobniejsze niż kategoria. Wzorzec pochodzi z dokumentacji Microsoft. Sprawdziliśmy go na Nordvelli zapytaniem, w którym relację wiele do wielu zastąpiła funkcja TREATAS: wiersze marek były puste, a cztery kategorie dostały swoje budżety.
    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]
    )
  5. Ukryj w 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.
  6. Gdy wiele do wielu łączy dwa wymiary, na przykład zwrot z kilkoma powodami, dokumentacja Microsoft zaleca tabelę pomostową: każda encja jako osobna tabela z identyfikatorem, pomost z parami identyfikatorów, relacje jeden do wielu i jedna relacja z kierunkiem w obie strony, żeby filtr przeszedł przez pomost. Czym grozi ten kierunek, opisujemy w poście o kierunku filtrowania Oba.

Jak sprawdzić, że problem zniknął

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.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Many-to-many relationship guidance (Relate higher grain facts) (źródło)
  • Microsoft Learn: Model relationships in Power BI Desktop (Many-to-many cardinality, Limited relationships) (źródło)
  • Microsoft Learn: TREATAS function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: budżet według marki i kategorii przez TREATAS jako odpowiednik relacji wiele do wielu, miara z ISFILTERED, sumy wierszy.

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

Kiedy używać relacji wiele do wielu w Power BI?
Gdy żadna z łączonych kolumn nie ma unikatowych wartości z natury danych, na przykład budżet zapisany na kategoriach i tabela produktów. Taka relacja daje poprawne liczby, dopóki wizualizacja grupuje po kolumnie z poziomu klucza relacji, czyli po kategorii.
Dlaczego suma wierszy nie zgadza się z sumą przy relacji wiele do wielu?
Każdy wiersz dostaje wszystkie wartości, które pasują do jego listy kluczy, więc ten sam budżet kategorii trafia do kilku marek. Na modelu Nordvelli suma marek wyszła 1 003 277 012,87 zł, a budżet całości 541 917 189,40 zł, bo wiersz sumy liczy każdą kategorię raz.
Czy relacja wiele do wielu jest wolniejsza od relacji jeden do wielu?
Według dokumentacji Microsoft propagacja filtrów po relacji o kardynalności wiele do wielu jest wolniejsza niż po relacjach jeden do wielu. Taka relacja jest też ograniczona: silnik łączy tabele w czasie zapytania, a funkcja RELATED po niej nie działa.
Czym zastąpić relację wiele do wielu w Power BI?
Dodaj tabelę wymiaru na poziomie wspólnego klucza, na przykład kategorii, i połącz ją relacjami wiele do jednego z obiema tabelami. Przy dwóch wymiarach powiązanych wiele do wielu zastosuj tabelę pomostową z relacjami jeden do wielu i jedną relacją filtrującą w obie strony.

Komentarze (0)

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

Brak komentarzy...