Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Model danych i relacje

Nie można utworzyć relacji jeden do wielu, bo kolumna ma zduplikowane wartości

W skrócie

  • Power BI nie tworzy relacji jeden do wielu, gdy kolumna po stronie jeden ma zduplikowane wartości, a odświeżenie modelu z taką relacją kończy się błędem, który podaje kolumnę i powtórzoną wartość.
  • Strona jeden relacji musi mieć każdą wartość klucza tylko raz. Gdy ten sam produkt ma w tabeli wymiaru dwa wiersze, silnik nie wie, do którego z nich przypisać transakcje.
  • Znajdź duplikaty zapytaniem DAX, porównując COUNTROWS z DISTINCTCOUNT, popraw je w Power Query po ujednoliceniu wielkości liter i spacji, a kardynalności Wiele do wielu nie włączaj na ślepo, bo zawyża sumy.

W oknie Nowa relacja zamiast Wiele do jednego (*:1) pojawia się Wiele do wielu (*:*), a ręczna zmiana kardynalności kończy się komunikatem, że jedna z kolumn musi zawierać unikatowe wartości. Winne są zduplikowane wartości w kluczu wymiaru, a problem wraca przy odświeżeniu, gdy w źródle pojawi się drugi wiersz z tym samym kluczem. Pokazujemy, jak znaleźć powtórzone i puste wartości, skąd się biorą i dlaczego przełączenie relacji na wiele do wielu zwykle tylko ukrywa błąd.

Jak to wygląda w praktyce

Power BI Desktop sam ustala kardynalność nowej relacji, sprawdzając, które kolumny mają unikatowe wartości. Gdy klucz wymiaru ma duplikaty, w oknie Nowa relacja zamiast Wiele do jednego (*:1) pojawia się Wiele do wielu (*:*). Power BI Desktop ma też dwa komunikaty dla relacji, której dane nie pozwalają na wybraną kardynalność: „Wybrana kardynalność nie jest prawidłowa dla tej relacji.” (w angielskiej wersji: „The cardinality you selected isn't valid for this relationship.”) oraz „Nie można utworzyć relacji między tymi dwiema kolumnami, ponieważ jedna z tych kolumn musi zawierać unikatowe wartości.” (w angielskiej wersji: „You can't create a relationship between these two columns because one of the columns must have unique values.”).

Gdy relacja już istnieje, a duplikat przyjdzie ze źródła, odświeżenie kończy się komunikatem silnika z nazwą kolumny i powtórzoną wartością: „Kolumna „ProduktID” w tabeli „DimProdukty” zawiera zduplikowaną wartość „1” i jest to niedozwolone dla kolumn po jednej stronie relacji wiele-do-jednego lub dla kolumn, które są używane jako klucz podstawowy tabeli.” (w angielskiej wersji: „Column 'ProduktID' in Table 'DimProdukty' contains a duplicate value '1' and this is not allowed for columns on the one side of a many-to-one relationship or for columns that are used as the primary key of a table.”). Dla pustego klucza silnik ma osobny komunikat: kolumna „zawiera puste wartości i nie jest to dozwolone w przypadku kolumn po jednej stronie relacji wiele-do-jednego” (w angielskiej wersji: „contains blank values and this is not allowed for columns on the one side of a many-to-one relationship”).

Dlaczego tak się dzieje

Relacja jeden do wielu zakłada, że po stronie jeden każda wartość klucza występuje dokładnie raz. Wtedy każda transakcja z FaktSprzedaz trafia do jednego wiersza DimProdukty, a filtr z produktu spływa do faktów bez dwuznaczności. W modelu Nordvelli tak jest: DimProdukty ma 30 wierszy i 30 różnych wartości ProduktID, DimSklepy 15 i 15, DimKalendarz 1826 i 1826. Według dokumentacji Microsoft próba wczytania duplikatów do kolumny po stronie jeden przy odświeżeniu kończy się niepowodzeniem całego odświeżenia.

Duplikat bierze się zwykle z trzech sytuacji. Pierwsza to zła kolumna klucza: DimSklepy[Miasto] ma 11 różnych wartości na 15 sklepów (Warszawa 4 razy, Kraków 2 razy), więc relacja po mieście nie dostanie strony jeden. Druga to wiersz dopisany w źródle, na przykład ten sam produkt w drugiej kategorii. Trzecia to różnica, którą widzi Power Query, a nie widzi model. Według dokumentacji Microsoft Power Query rozróżnia wielkość liter, a silnik modelu nie rozróżnia, więc „KEL-01” i „kel-01” przechodzą przez Usuń duplikaty jako dwie wartości, a w modelu są jedną. W naszym zapytaniu DAX te dwa teksty dały jedną wartość DISTINCT, a tekst ze spacją na końcu osobną. Więcej o tych pułapkach w poście o duplikatach, których Usuń duplikaty nie usuwa.

Co zrobić krok po kroku

  1. Sprawdź klucz, zanim zmienisz relację. Otwórz Widok zapytań w języku DAX, wklej zapytanie i kliknij Uruchom. Na modelu Nordvelli wynik to 30 wierszy, 30 unikatowych wartości i pusta trzecia kolumna, czyli brak pustych kluczy. Gdy druga liczba jest mniejsza od pierwszej, klucz ma duplikaty.
    EVALUATE
    ROW(
        "Wiersze", COUNTROWS(DimProdukty),
        "Unikatowe", DISTINCTCOUNT(DimProdukty[ProduktID]),
        "Puste", COUNTROWS(FILTER(DimProdukty, ISBLANK(DimProdukty[ProduktID])))
    )
  2. Wypisz powtórzone wartości. Zapytanie zwraca każdą wartość kolumny, która występuje w więcej niż jednym wierszu. Dla DimSklepy[Miasto] dało dwa wiersze: Warszawa 4 i Kraków 2. Dla DimProdukty[ProduktID] nie zwróciło nic. Podstaw swoją tabelę i kolumnę klucza.
    EVALUATE
    FILTER(
        ADDCOLUMNS(
            VALUES(DimSklepy[Miasto]),
            "n", CALCULATE(COUNTROWS(DimSklepy))
        ),
        [n] > 1
    )
  3. Obejrzyj powtórzone wiersze w Power Query. Na karcie Narzędzia główne kliknij Przekształć dane, zaznacz zapytanie wymiaru i kolumnę klucza, a potem w grupie Zmniejsz wiersze rozwiń Zachowaj wiersze i wybierz Zachowaj duplikaty. Zostaną tylko wiersze z powtórzonym kluczem. Gdy różnią się tylko wielkością liter albo spacją, przejdź do kroku 4. Gdy niosą różne informacje (inna kategoria, inna cena), to nie są duplikaty do usunięcia, tylko znak, że kolumna nie jest kluczem. Po obejrzeniu usuń ten krok z listy kroków zapytania.
  4. Ujednolić zapis tekstowego klucza przed usuwaniem duplikatów: zaznacz kolumnę, na karcie Przekształć rozwiń Format i wybierz Wielkie litery, a potem z tej samej listy Przytnij. To samo zrób z kolumną klucza w tabeli faktów, bo w naszym teście tekst ze spacją na końcu był osobną wartością i nie znalazłby pary w wymiarze. Dokumentacja Microsoft zaleca zamianę wielkości liter przed usuwaniem duplikatów, bo Power Query je rozróżnia.
  5. Usuń prawdziwe duplikaty: zaznacz kolumnę klucza, na karcie Narzędzia główne rozwiń Usuń wiersze i wybierz Usuń duplikaty. Według dokumentacji Microsoft Power Query nie gwarantuje, który z powtórzonych wierszy zostanie, więc gdy ma zostać konkretny, najpierw go wskaż, jak w poście o zachowaniu najnowszego rekordu. Wiersze z pustym kluczem odfiltruj w tym samym zapytaniu.
  6. Nie przełączaj relacji na Wiele do wielu (*:*) tylko po to, żeby błąd zniknął. Sprawdziliśmy to na kopii DimProdukty z drugim wierszem produktu 1 (Laptop Kelvani Vela 13) w kategorii AGD/RTV, połączonej w zapytaniu z faktami funkcją TREATAS, czyli tak, jak łączy relacja wiele do wielu. Suma wierszy według kategorii wyniosła 486 802 641,96 zł zamiast 467 775 009,17 zł, a AGD/RTV urosło dokładnie o 19 027 632,79 zł, czyli o sprzedaż tego laptopa policzoną drugi raz. Kiedy taka relacja jest właściwa, opisujemy w poście o relacji wiele do wielu.

Jak sprawdzić, że problem zniknął

Po poprawce uruchom ponownie zapytanie z kroku 1: liczba wierszy i liczba unikatowych wartości mają być równe, a kolumna pustych kluczy pusta. Wtedy po przeciągnięciu kolumny klucza na diagramie (Widok modelu) Power BI proponuje Wiele do jednego (*:1), a suma sprzedaży według kategorii wraca do 467 775 009,17 zł. Kroki z wielkimi literami, przycinaniem i usuwaniem duplikatów zostają w zapytaniu, więc działają przy każdym odświeżeniu.

Klucz wymiaru bierz z kolumny identyfikatora, nie z nazwy czy miasta, i trzymaj jego oczyszczanie w Power Query, jak w lekcji o usuwaniu duplikatów bez gubienia danych. Gdy odświeżenie mimo to zgłosi zduplikowaną wartość, komunikat podaje ją wprost: wyszukaj ją w źródle i zdecyduj, czy to błąd danych, czy drugi wiersz o innym znaczeniu.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Model relationships in Power BI Desktop (sekcja Cardinality) (źródło)
  • Microsoft Learn: Create and manage relationships in Power BI Desktop (źródło)
  • Microsoft Learn: Working with duplicate values (Power Query) (źródło)
  • Microsoft Learn: DirectQuery in Power BI (silnik bez rozróżniania wielkości liter) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: unikatowość kluczy wymiarów, duplikaty miast, kopia DimProdukty z powtórzonym produktem i porównanie tekstów różniących się wielkością liter.

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

Dlaczego Power BI nie pozwala utworzyć relacji jeden do wielu?
Kolumna po stronie jeden musi mieć każdą wartość tylko raz. Gdy klucz w tabeli wymiaru się powtarza, Power BI proponuje kardynalność Wiele do wielu, a odświeżenie istniejącej relacji kończy się komunikatem o zduplikowanej wartości z nazwą kolumny i tą wartością. Na puste wartości w takiej kolumnie silnik ma osobny komunikat.
Jak znaleźć zduplikowane wartości w kolumnie klucza Power BI?
W widoku zapytań w języku DAX porównaj COUNTROWS tabeli z DISTINCTCOUNT kolumny klucza. Gdy druga liczba jest mniejsza, wypisz powtórzone wartości zapytaniem FILTER z ADDCOLUMNS, które zostawia wartości z liczbą wierszy większą od 1. W Power Query te same wiersze pokaże polecenie Zachowaj duplikaty.
Czy można ustawić relację wiele do wielu zamiast usuwać duplikaty?
Można, ale przy zduplikowanym kluczu wymiaru sumy rosną. Na modelu Nordvelli produkt zapisany w dwóch kategoriach dał sumę kategorii 486 802 641,96 zł zamiast 467 775 009,17 zł, bo jego sprzedaż policzyła się dwa razy. Duplikat trzeba poprawić w danych.
Dlaczego Usuń duplikaty w Power Query nie pomaga i relacja dalej zgłasza duplikat?
Power Query rozróżnia wielkość liter, a silnik modelu Power BI nie, więc KEL-01 i kel-01 przechodzą przez Usuń duplikaty jako dwie wartości, a w modelu są jedną. Przed usuwaniem duplikatów zamień tekst na wielkie litery i przytnij spacje.

Komentarze (0)

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

Brak komentarzy...