Blog JSystems - uwalniamy wiedzę!
Blog JSystems - uwalniamy wiedzę!
Power BI - Model danych i relacje
Sprzedaż i budżet w jednym raporcie Power BI - dwie tabele faktów i wspólne wymiary
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.
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ę.
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.
Zobacz też: Szkolenie Power BI - Desktop, DAX i Online + Copilot
DimSklepy, DimKategorie i DimKalendarz, a DimProdukty i DimPracownicy nie mają relacji z budżetem (DimProdukty filtruje sprzedaż i zwroty, DimPracownicy samą sprzedaż).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())
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.EVALUATE
ADDCOLUMNS(
VALUES(DimProdukty[Marka]),
"Sprzedaż", [Łączna sprzedaż],
"Budżet", [Budżet sprzedaży],
"Realizacja", [Realizacja budżetu %]
)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")
)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ł.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.

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