Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Model danych i relacje

Jedna płaska tabela czy model gwiazdy - dlaczego płaska tabela daje kłopoty

W skrócie

  • Model gwiazdy w Power BI trzyma liczby i klucze w tabeli faktów, a opisy w wymiarach. Jedna płaska tabela wygląda prościej, ale powtarza atrybuty w każdym wierszu i nie mieści danych o innym poziomie szczegółowości, takich jak budżet.
  • Wartość wymiaru doklejona do transakcji sumuje się tyle razy, ile jest transakcji: w Nordvelli plan sprzedaży rośnie z 541,9 mln zł do 37,5 mld zł, a powierzchnia sklepów z 8680 do 50 126 550 m².
  • Zostaw w faktach klucze i liczby, opisy przenieś w Power Query do wymiarów, a budżet trzymaj w osobnej tabeli faktów połączonej z tymi samymi wymiarami.

Z systemu przychodzi jeden szeroki eksport i najprościej byłoby zbudować raport Power BI od razu na nim, bez modelu gwiazdy. Na początku wszystko działa, a kłopoty zaczynają się przy pierwszej sumie atrybutu sklepu albo przy budżecie, który jest miesięczny, a nie przypisany do transakcji. Pokazujemy na modelu Nordvelli, jakie liczby daje tabela płaska, skąd się biorą i jak rozdzielić ją na fakty i wymiary.

Jak to wygląda w praktyce

Tabela płaska (ang. flat table) to jedna tabela, w której każdy wiersz transakcji ma doklejone opisy: nazwę produktu, kategorię, miasto i powierzchnię sklepu, a czasem także plan sprzedaży. Objawy to sumy bez sensu i liczby, które rosną po dopisaniu kolejnych transakcji, choć plan się nie zmienił. Odtworzyliśmy to zapytaniami na modelu Nordvelli, doklejając wartości z wymiarów do 108 675 wierszy sprzedaży.

Powierzchnia: w wymiarze DimSklepy 15 sklepów ma razem 8680 m², a ta sama kolumna doklejona do transakcji sumuje się do 50 126 550 m². Budżet: FaktBudzet ma 541 917 189,40 zł planu, a plan doklejony do transakcji daje 37 505 381 667,40 zł. W jednym przykładzie, Nordvella Warszawa Centrum, kategoria Komputery, marzec 2025, plan 187 770,22 zł trafia do 46 transakcji, więc w sumie liczy się 46 razy.

Dlaczego tak się dzieje

Fakty i wymiary mają inne ziarno, czyli poziom szczegółowości jednego wiersza. Wiersz sprzedaży to jedna pozycja transakcji, wiersz budżetu Nordvelli to sklep, kategoria i miesiąc, a wiersz DimSklepy to jeden sklep. Złączenie ich w jedną tabelę kopiuje każdą wartość wymiaru do wszystkich wierszy, które do niej pasują, a sumowanie mnoży ją przez liczbę tych wierszy. Ten sam mechanizm widać w Power Query przy scalaniu z tabelą, w której klucz się powtarza, co opisujemy w poście po scaleniu zapytań przybyło wierszy.

Druga strata jest mniej widoczna. Tabela płaska ma wiersz tylko tam, gdzie była transakcja. W Nordvelli 420 wierszy budżetu, czyli 65 134 492,50 zł planu na miesiące od czerwca do grudnia 2026, nie ma żadnej sprzedaży, więc po złączeniu z transakcjami po prostu znika. Według dokumentacji Microsoft dane z eksportu są zwykle zdenormalizowane, czyli mają opisy powtórzone przy kluczach, i warto je w Power Query rozdzielić na tabele faktów i wymiarów.

Co zrobić krok po kroku

  1. Zacznij od ziarna. Dla każdej kolumny zapisz, od czego zależy jej wartość. Kolumny, które zmieniają się z transakcją (ilość, wartość, koszt), zostają w tabeli faktów. Kolumny zależne tylko od produktu, sklepu albo daty (nazwa, marka, miasto, powierzchnia) idą do wymiarów. W Nordvelli wokół FaktSprzedaz są cztery wymiary: DimProdukty (30 wierszy), DimSklepy (15), DimPracownicy (200) i DimKalendarz (1826).
  2. W edytorze Power Query zbuduj wymiar z płaskiej tabeli. Kliknij zapytanie prawym przyciskiem i wybierz Odwołanie, w nowym zapytaniu zostaw klucz i kolumny produktu (Usuń inne kolumny), a potem wybierz Usuń duplikaty. W zapytaniu faktów zostaw sam klucz i usuń kolumny opisowe przyciskiem Usuń kolumny. Gdy eksport nie ma identyfikatora, kluczem może być nazwa, o ile w wymiarze jest unikatowa. Dlaczego tu potrzebne jest odwołanie, a nie duplikat, wyjaśniamy w poście odwołanie czy duplikat zapytania.
  3. Połącz tabele relacjami jeden do wielu od wymiaru do faktów. W widoku modelu przeciągnij kolumnę klucza z wymiaru na kolumnę klucza w faktach albo w oknie Zarządzanie relacjami kliknij Nowa relacja. Po stronie wymiaru wartości klucza muszą być unikatowe.
  4. Budżet zostaw w osobnej tabeli faktów o własnym ziarnie i połącz ją z tymi samymi wymiarami. W Nordvelli FaktBudzet ma 3600 wierszy (15 sklepów, 4 kategorie, 60 miesięcy) i relacje z DimSklepy, DimKategorie i DimKalendarz. Jak ułożyć miary na dwóch tabelach faktów, pokazujemy w poście sprzedaż i budżet w jednym raporcie.
  5. Zmierz skalę problemu, zanim usuniesz starą tabelę. Zapytanie dokleja do każdej transakcji plan jej sklepu, kategorii i miesiąca, tak jak zrobiłaby to tabela płaska, i porównuje sumę z budżetem w modelu. Na Nordvelli wychodzi 541 917 189,40 zł w modelu i 37 505 381 667,40 zł po doklejeniu.
    EVALUATE
    ROW(
        "Budżet w modelu", [Budżet sprzedaży],
        "Budżet doklejony do transakcji",
            SUMX(
                FaktSprzedaz,
                VAR Sklep = FaktSprzedaz[SklepID]
                VAR Kategoria = RELATED(DimProdukty[KategoriaID])
                VAR Miesiac = INT(FaktSprzedaz[DataID] / 100) * 100 + 1
                RETURN LOOKUPVALUE(
                    FaktBudzet[BudzetSprzedazy],
                    FaktBudzet[SklepID], Sklep,
                    FaktBudzet[KategoriaID], Kategoria,
                    FaktBudzet[DataID], Miesiac
                )
            )
    )
  6. Miary pisz na tabeli faktów, a filtruj kolumnami wymiarów. Łączna sprzedaż = SUM(FaktSprzedaz[WartoscNetto]) po kategorii liczy się przez relacje z DimProdukty i 4-wierszową DimKategorie, a plan po kategorii przez relację FaktBudzet z tą samą DimKategorie. Dla kategorii Komputery to 130 476 189,61 zł sprzedaży i 150 729 438,59 zł planu, bez żadnego przeliczania duplikatów w formule.
Widok Model Power BI, Układ 1: FaktSprzedaz pośrodku i cztery wymiary DimProdukty, DimSklepy, DimPracownicy, DimKalendarz
Gwiazda Nordvelli w widoku modelu: FaktSprzedaz pośrodku, wokół cztery wymiary. Każda relacja ma po stronie wymiaru 1, a po stronie faktu gwiazdkę, a strzałka pokazuje kierunek filtrowania od wymiaru do faktu.

Jak sprawdzić, że problem zniknął

Po rozdzieleniu sumy atrybutów i planu muszą się zgadzać z sumami w wymiarach i w tabeli budżetu. Zapytanie poniżej pokazuje różnicę dla powierzchni: 8680 m² w wymiarze i 50 126 550 m² po doklejeniu do transakcji. W modelu gwiazdy suma powierzchni po sklepach to 8680 m², a budżet 541 917 189,40 zł.

EVALUATE
ROW(
    "Powierzchnia w wymiarze", SUM(DimSklepy[Powierzchnia_m2]),
    "Powierzchnia doklejona do transakcji", SUMX(FaktSprzedaz, RELATED(DimSklepy[Powierzchnia_m2]))
)

Lekcja o wydajności zestawia oba układy na tych samych danych: nazwa produktu występuje w gwieździe 30 razy, a w tabeli płaskiej 108 675 razy, a grupowanie po kategorii korzysta z 4 wierszy wymiaru zamiast całej tabeli faktów. Jak sprawdzić rozmiar modelu w VertiPaq Analyzer, pokazujemy w lekcji o optymalizacji modelu.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Understand star schema and the importance for Power BI (źródło)
  • Microsoft Learn: Many-to-many relationship guidance (Relate higher grain facts) (źródło)
  • Microsoft Learn: LOOKUPVALUE function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: budżet i powierzchnia doklejone do 108 675 transakcji, wiersze budżetu bez sprzedaży, plan jednego sklepu, kategorii i miesiąca.

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

Co to jest model gwiazdy w Power BI?
To układ, w którym tabela faktów z liczbami i kluczami jest pośrodku, a tabele wymiarów z opisami wokół niej. Wymiary łączą się z faktami relacjami jeden do wielu, a filtr płynie od wymiaru do faktów. W modelu Nordvelli FaktSprzedaz otaczają DimProdukty, DimSklepy, DimPracownicy i DimKalendarz.
Dlaczego płaska tabela w Power BI daje złe sumy?
Wartość wymiaru, na przykład powierzchnia sklepu, powtarza się w każdym wierszu transakcji, więc suma mnoży ją przez liczbę transakcji. Na modelu Nordvelli powierzchnia 15 sklepów to 8680 m², a ta sama kolumna doklejona do transakcji sumuje się do 50 126 550 m².
Czy budżet może być w tej samej tabeli co sprzedaż w Power BI?
Lepiej nie, bo budżet ma inne ziarno, zwykle miesiąc, sklep i kategorię. Doklejony do transakcji liczy się tyle razy, ile było transakcji, a miesiące bez sprzedaży znikają. W Nordvelli plan rośnie z 541 917 189,40 zł do 37 505 381 667,40 zł, a 65 134 492,50 zł planu bez sprzedaży wypada.
Jak zamienić płaską tabelę na model gwiazdy w Power BI?
W Power Query utwórz odwołanie do płaskiego zapytania, zostaw w nim klucz i kolumny opisu, usuń duplikaty i nazwij to wymiarem. W zapytaniu faktów zostaw klucz i liczby, a potem połącz tabele relacją jeden do wielu od wymiaru do faktów.

Komentarze (0)

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

Brak komentarzy...