Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Model danych i relacje

Sprzedaż i budżet w jednym raporcie Power BI - dwie tabele faktów i wspólne wymiary

W skrócie

  • Budżet i sprzedaż w Power BI najlepiej trzymać w dwóch tabelach faktów połączonych ze wspólnymi wymiarami: sklepem, kategorią i kalendarzem. Relacja między samymi tabelami faktów nie jest potrzebna.
  • Budżet ma grubsze ziarno niż sprzedaż: miesiąc, sklep i kategorię. Filtr marki, produktu albo dnia nie ma po czym go zawęzić, więc pokazuje cały plan albo pustą komórkę, a realizacja wychodzi bez sensu.
  • Filtruj obie tabele kolumnami wspólnych wymiarów, a w mierze budżetu zwracaj pustą wartość, gdy raport schodzi poniżej ziarna planu.

Budżet i sprzedaż w jednym raporcie Power BI to typowy przypadek modelu z dwiema tabelami faktów. Sprzedaż ma jeden wiersz na pozycję transakcji, a plan jeden wiersz na sklep, kategorię i miesiąc. Pokazujemy, jak model Nordvelli łączy obie tabele wspólnymi wymiarami, w których miejscach budżet przestaje reagować na filtry i jak napisać miarę, która w takich miejscach nie pokazuje mylącej liczby.

Jak to wygląda w praktyce

Realizacja budżetu po kategoriach wygląda dobrze, ale po wstawieniu marki do macierzy każda marka ma ten sam budżet, równy planowi całej sieci. Na modelu Nordvelli Budżet sprzedaży przy każdej z pięciu marek wynosi 541 917 189,40 zł, a Realizacja budżetu % spada do 23,2% dla marki Kelvani i 4,1% dla marki Nordvella. To samo daje kolumna DimProdukty[Kategoria]: przy każdej kategorii cały plan sieci. Kolumna DimKategorie[Kategoria] rozkłada plan poprawnie, na przykład 150 729 438,59 zł dla kategorii Komputery.

Drugi objaw dotyczy kalendarza. Budżet na 15 marca 2025 jest pusty, a na 1 marca wynosi 8 991 909,57 zł, czyli plan całego miesiąca. Po wybraniu we fragmentatorze samych weekendów plan pokazuje 160 501 097,13 zł, bo liczy miesiące, których pierwszy dzień wypadł w sobotę albo w niedzielę.

Dlaczego tak się dzieje

Filtr płynie relacją od wymiaru do faktów. FaktBudzet w Nordvelli ma relacje z DimSklepy, DimKategorie i DimKalendarz, a nie ma relacji z DimProdukty, bo plan nie jest rozpisany na produkty. Filtr marki zawęża więc sprzedaż, a budżetu nie dotyka. DimProdukty[Kategoria] to nazwa kategorii zapisana w wymiarze produktów i filtruje tylko to, co leży pod DimProdukty. DimKategorie filtruje plan wprost, a sprzedaż przez DimProdukty, dlatego działa dla obu tabel.

Plan miesięczny jest zapisany pod pierwszym dniem miesiąca: FaktBudzet[DataID] to Rok * 10000 + Miesiac * 100 + 1. Skutki tego zapisu dla realizacji w niepełnym roku omawiamy w lekcji z projektem końcowym. Dokumentacja Microsoft zaleca taki zapis dla faktów o grubszym ziarnie czasu, ale ostrzega, że bez dodatkowej logiki w mierze pozostałe dni pokażą pustą wartość. Odradza też łączenie dwóch tabel faktów wprost, bo raport może wtedy filtrować i grupować tylko po kolumnie, która je łączy. Taką relację wiele do wielu opisujemy w poście relacja wiele do wielu w Power BI.

Co zrobić krok po kroku

  1. Sprawdź relacje obu tabel faktów w widoku modelu albo w oknie Zarządzanie relacjami. Każdy wymiar, po którym porównujesz plan ze sprzedażą, musi filtrować obie tabele. W Nordvelli wspólne są DimSklepy, DimKategorie i DimKalendarz, a DimProdukty i DimPracownicy nie mają relacji z budżetem (DimProdukty filtruje sprzedaż i zwroty, DimPracownicy samą sprzedaż).
  2. Miary twórz osobno dla każdej tabeli faktów i łącz je dopiero w mierze realizacji, tak jak w Nordvelli. Każdą dodaj prawym przyciskiem na właściwej tabeli w panelu Dane i poleceniem Nowa miara: sprzedaż w FaktSprzedaz, budżet i realizację w FaktBudzet.
    Łączna sprzedaż = SUM(FaktSprzedaz[WartoscNetto])
    
    Budżet sprzedaży = SUM(FaktBudzet[BudzetSprzedazy])
    
    Realizacja budżetu % = DIVIDE([Łączna sprzedaż], [Budżet sprzedaży], BLANK())
  3. Na wizualizacjach z budżetem używaj kolumn wspólnych wymiarów: kategorii z DimKategorie, sklepu z DimSklepy, roku i miesiąca z DimKalendarz. Kolumnę DimProdukty[Kategoria] ukryj w widoku raportu, żeby nikt jej nie pomylił z kategorią z DimKategorie, o czym piszemy w poście po co ukrywać klucze i kolumny techniczne.
  4. Sprawdź, które filtry nie docierają do budżetu. Zapytanie w widoku zapytań w języku DAX liczy sprzedaż, budżet i realizację dla każdej marki. Na Nordvelli budżet jest przy każdej marce taki sam, 541 917 189,40 zł, więc żadna realizacja w tej tabeli nie ma sensu.
    EVALUATE
    ADDCOLUMNS(
        VALUES(DimProdukty[Marka]),
        "Sprzedaż", [Łączna sprzedaż],
        "Budżet", [Budżet sprzedaży],
        "Realizacja", [Realizacja budżetu %]
    )
  5. Napisz miarę budżetu, która pilnuje ziarna planu. Porównuje liczbę widocznych dni z liczbą dni w pełnych miesiącach, które są widoczne, i zwraca pustą wartość, gdy raport schodzi poniżej miesiąca albo filtruje produkty. Kod to zapytanie do widoku zapytań w języku DAX, które definiuje miarę i od razu ją sprawdza. W modelu dodaj ją w FaktBudzet przez Nowa miara jako Budżet w ziarnie = z treścią od pierwszego VAR do końca IF, bez DEFINE, MEASURE i części EVALUATE. Na Nordvelli marzec 2025 daje 8 991 909,57 zł, kategoria Komputery 150 729 438,59 zł, a 15 marca, same weekendy i marka Kelvani pustą wartość.
    DEFINE
    MEASURE FaktBudzet[Budżet w ziarnie] =
        VAR DniWidoczne = COUNTROWS(DimKalendarz)
        VAR DniPelnychMiesiecy =
            CALCULATE(
                COUNTROWS(DimKalendarz),
                REMOVEFILTERS(DimKalendarz),
                VALUES(DimKalendarz[PierwszyDzienMiesiaca])
            )
        RETURN
            IF(
                DniWidoczne = DniPelnychMiesiecy && NOT ISFILTERED(DimProdukty),
                [Budżet sprzedaży]
            )
    EVALUATE
    ROW(
        "Marzec 2025", CALCULATE([Budżet w ziarnie], DimKalendarz[Rok] = 2025, DimKalendarz[Miesiac] = 3),
        "15 marca 2025", CALCULATE([Budżet w ziarnie], DimKalendarz[Data] = DATE(2025, 3, 15)),
        "Weekendy", CALCULATE([Budżet w ziarnie], DimKalendarz[CzyWeekend] = 1),
        "Marka Kelvani", CALCULATE([Budżet w ziarnie], DimProdukty[Marka] = "Kelvani"),
        "Kategoria Komputery", CALCULATE([Budżet w ziarnie], DimKategorie[Kategoria] = "Komputery")
    )
  6. Realizację licz na nowej mierze: Realizacja w ziarnie = DIVIDE([Łączna sprzedaż], [Budżet w ziarnie]). Przy marce i przy pojedynczym dniu komórka zostaje pusta, zamiast pokazać 23,2% albo plan całego miesiąca. Na poziomie roku, kwartału, sklepu i kategorii wynik się nie zmienia: rok 2025 to 129 209 118,49 zł planu, pierwszy kwartał 2025 to 27 308 655,64 zł, a Nordvella Warszawa Centrum 41 909 608,32 zł.

Jak sprawdzić, że problem zniknął

Postaw macierz z kategorią z DimKategorie i rokiem z DimKalendarz oraz z miarami sprzedaży, budżetu i realizacji. Dla roku 2025 Nordvelli wynik to 126 734 270,47 zł sprzedaży wobec 129 209 118,49 zł planu, czyli 98,1%. Dla całego okresu 467 775 009,17 zł wobec 541 917 189,40 zł, czyli 86,3%, bo plan obejmuje też miesiące od czerwca do grudnia 2026, w których nie ma jeszcze sprzedaży. Strona Realizacja budżetu w projekcie końcowym zestawia tę samą sprzedaż z budżetem do 31.05.2026, ostatniego dnia ze sprzedażą, i wtedy realizacja wynosi 98,1%. To ta sama wartość co dla roku 2025, ale inne obliczenie. Jak liczyć realizację tylko do dnia ostatniej sprzedaży, pokazujemy w poście porównanie przy niepełnym roku.

Potem dodaj do macierzy markę albo dzień. Miara budżetu w ziarnie ma tam pustą komórkę, a suma kategorii się nie zmienia. Każdą nową tabelę faktów łącz z tymi samymi wymiarami, a nie z inną tabelą faktów.

Strona Realizacja budżetu w Power BI: karty sprzedaży 468 mln zł, budżetu 542 mln zł i realizacji 86,3 oraz 98,1 procent
Strona Realizacja budżetu z projektu końcowego Nordvelli: ta sama sprzedaż wobec dwóch mianowników, 86,3 procent wobec budżetu całego okresu i 98,1 procent wobec budżetu do 31.05.2026.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Many-to-many relationship guidance (Relate higher grain facts, Relate many-to-many facts) (źródło)
  • Microsoft Learn: Understand star schema and the importance for Power BI (źródło)
  • Microsoft Learn: ISFILTERED function (DAX) (źródło)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: budżet po markach i kategoriach, budżet dnia, miesiąca i weekendów, miara budżetu w ziarnie.

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

Jak połączyć budżet i sprzedaż w jednym raporcie Power BI?
Trzymaj je w dwóch tabelach faktów i połącz każdą relacją jeden do wielu z tymi samymi wymiarami, na przykład sklepem, kategorią i kalendarzem. Miary sprzedaży i budżetu twórz w ich tabelach, a realizację licz trzecią miarą z DIVIDE. W modelu Nordvelli tak połączone są FaktSprzedaz i FaktBudzet.
Dlaczego budżet w Power BI pokazuje tę samą wartość przy każdym produkcie?
Tabela budżetu nie ma relacji z wymiarem produktów, bo plan nie jest rozpisany na produkty, więc filtr produktu albo marki nie ma jej jak zawęzić. Na modelu Nordvelli każda marka pokazuje cały plan sieci, 541 917 189,40 zł. Pomaga miara, która przy filtrze produktów zwraca pustą wartość.
Dlaczego budżet miesięczny w Power BI jest pusty w zwykłe dni?
Plan miesięczny jest zapisany pod pierwszym dniem miesiąca, więc pozostałe dni nie mają wierszy budżetu. W Nordvelli 1 marca 2025 pokazuje plan całego miesiąca, 8 991 909,57 zł, a 15 marca pustą wartość. Miara powinna zwracać budżet tylko wtedy, gdy raport pokazuje pełne miesiące.
Czy łączyć tabelę budżetu bezpośrednio z tabelą sprzedaży w Power BI?
Dokumentacja Microsoft odradza łączenie dwóch tabel faktów wprost, bo raport może wtedy filtrować i grupować tylko po kolumnie, która je łączy. Lepiej połączyć obie tabele z tymi samymi wymiarami. Wtedy jeden fragmentator sklepu, kategorii albo roku filtruje sprzedaż i plan naraz.

Komentarze (0)

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

Brak komentarzy...