Blog JSystems - uwalniamy wiedzę!

Szukaj
Power BI Desktop z paskiem formuły miary DAX i pulpitem Nordvelli: karty KPI, słupki miast, pierścień kategorii, marża
Cały ten rozdział mieści się w jednym kadrze. U góry pasek formuły z definicją miary: Łączna sprzedaż = SUM ( FaktSprzedaz[WartoscNetto] ). Obok wstążka Narzędzia miar, gdzie ustawia się format raz na mierze, a nie w każdym wizualu osobno. Pod spodem efekt tej jednej linijki: karta z 468 mln zł, słupkowy sprzedaży wg miast, pierścień kategorii i linia zestawiona z budżetem - wszystkie liczą tę samą miarę, każdy w swoim kontekście. To podgląd gotowego raportu z kolejnych lekcji, w pliku tej lekcji powstają karta i macierz.

W skrócieDAX (Data Analysis Expressions) to język formuł Power BI, w którym liczysz miary takie jak sprzedaż netto czy marża procentowa. W tej lekcji odróżniasz miarę od kolumny obliczeniowej, budujesz pierwsze miary na danych Nordvelli, poznajesz kontekst wiersza i kontekst filtra oraz najczęstsze błędy na początku.

Lekcja 7 z 28 bezpłatnego kursu Power BI, od pierwszego raportu do Fabric i Copilota, na jednym zestawie danych sieci Nordvella.

<-- Spis wszystkich lekcji
<-- Lekcja 6: Model danych: star schema i relacjeLekcja 8: Wizualizacje podstawowe - słupkowy, liniowy, KPI -->

Masz już w Nordvella S.A. gotowy model gwiazdy: tabelę faktów FaktSprzedaz otoczoną wymiarami DimKalendarz, DimProdukty, DimSklepy i DimPracownicy. Model sam w sobie nie odpowie jednak na pytanie zarządu: ile sprzedaliśmy netto, ile wyniosła marża procentowa i jak to wygląda w podziale na miasta. Do tego służy DAX (Data Analysis Expressions), język formuł Power BI. W tym rozdziale zbudujesz pierwsze miary na danych Nordvelli, zrozumiesz pojęcie, na którym opiera się cały DAX, czyli kontekst, i nauczysz się rozpoznawać błędy, które mylą prawie każdego na początku.

Z tej lekcji dowiesz się:

Pliki do tej lekcji

Gotowy efekt: plik Power BI Desktop w stanie z końca tej lekcji, z tymi samymi zapytaniami, modelem i stronami raportu, które widać na zrzutach.

Pobierz nordvella_07_dax_podstawy.pbix

Plik startowy: stan z końca poprzedniej lekcji. Otwórz go, jeśli chcesz wykonywać kroki tej lekcji od razu, bez odtwarzania wcześniejszych.

Pobierz nordvella_06_model.pbix

Dane źródłowe:
Nordvella_dane.xlsx - dziewięć tabel Nordvelli w arkuszu Excel.
Nordvella.bak.gz - te same dane jako baza MS SQL Server (odtwarzasz poleceniem RESTORE DATABASE), do ćwiczeń z połączeniem z bazą SQL.

Pobierz Nordvella_dane.xlsxPobierz Nordvella.bak.gz

Miara czy kolumna obliczeniowa, kiedy co

Co chcemy osiągnąć. Zarząd Nordvelli będzie oglądać sprzedaż w podziale na miasta, regiony i miesiące, a każda liczba na wykresie ma się przeliczać po kliknięciu fragmentatora. Chcemy wiedzieć, kiedy taki wynik liczyć miarą, a kiedy kolumną obliczeniową, bo zły wybór daje raport wolny albo błędny.

Zanim wpiszesz choćby jedną literę DAX, musisz rozstrzygnąć jedną rzecz: czy tworzysz miarę, czy kolumnę obliczeniową. To częsta pomyłka początkujących i źródło raportów, które liczą się wolno albo pokazują bezsens. Wyjaśnimy różnicę na przykładzie Nordvella, żeby nie zostało to definicją ze słownika.

Panel Dane w Power BI: tabela FaktZwroty z kolumnami źródłowymi, kolumną obliczeniową DataZakupu i dwiema miarami
Trzy rodzaje obiektów w jednej tabeli i trzy różne ikony. W rozwiniętej FaktZwroty kolumny wczytane ze źródła mają symbol sumy (liczbowe) albo nie mają ikony. DataZakupu ma ikonę kolumny obliczeniowej, bo dopisaliśmy ją formułą w lekcji 06. Dwie pozycje Wartosc zwroto... z ikoną kalkulatora to miary z tej samej lekcji. Ikona mówi, z czym masz do czynienia, zanim klikniesz cokolwiek.
Wstążka Modelowanie w Power BI Desktop z przyciskami Nowa miara i Szybka miara, plik startowy lekcji 07
Wstążka Modelowanie w pliku startowym tej lekcji: Nowa miara i Szybka miara obok Zarządzania relacjami i Oznacz jako tabelę dat. W tle strona kontrolna z lekcji 06, trzy karty sierot z wartością 0. Miarę dodaje się stąd albo z menu kontekstowego tabeli.

Miara (ang. measure) to wzór, który liczy się na żywo, w momencie gdy patrzysz na wizual. Nie ma zapisanej wartości, ma tylko formułę. Gdy klikniesz fragmentator z miastem Kraków, miara przelicza się od nowa dla Krakowa. Miara zawsze zwraca jedną liczbę dla bieżącego kontekstu, na przykład sumę WartoscNetto dla widocznego wycinka danych.

Kolumna obliczeniowa (ang. calculated column) to nowa kolumna dopisana do tabeli. Liczy się raz, przy odświeżeniu danych, dla każdego wiersza z osobna, i zajmuje pamięć w modelu. Dla 108 675 wierszy FaktSprzedaz oznacza to 108 675 policzonych i zapisanych wartości. Kolumna ma sens tam, gdzie potrzebujesz etykiety na poziomie pojedynczego wiersza, na przykład pełnego imienia i nazwiska pracownika albo przypisania transakcji do przedziału wartości.

Miara kontra kolumna obliczeniowa w Power BI: miara liczy się w kontekście filtra, kolumna raz na wiersz przy odświeżaniu
Miara kontra kolumna obliczeniowa. Lewa strona: miara nie zajmuje miejsca i reaguje na filtry. Prawa: kolumna to zapisane wartości na każdym wierszu. Regułą kciuka jest: sumy i wskaźniki to miary, etykiety wierszowe to kolumny.
CechaMiaraKolumna obliczeniowa
Kiedy się liczyNa żywo, przy renderowaniu wizualuRaz, przy odświeżaniu danych
Zajmuje pamięćNie, przechowuje tylko wzórTak, wartość na każdym wierszu
Reaguje na fragmentatoryTak, przelicza się dla wycinkaNie, wartość jest stała
ZwracaJedną wartość dla kontekstuWartość dla każdego wiersza
Przykład NordvellaSuma sprzedaży netto, marża procentowaImię plus Nazwisko, przedział wartości transakcji

Wskazówka: gdyby ktoś kazał Ci wybrać jedną zasadę, brzmi ona tak. Jeśli wynik ma się sumować i zmieniać po kliknięciu w raporcie, buduj miarę. Jeśli wynik ma być stałą etykietą na tym samym wierszu tabeli, buduj kolumnę. Sumę WartoscNetto policzoną jako kolumna obliczeniowa rozdmuchasz model o setki tysięcy zbędnych wartości i i tak nie zsumujesz jej sensownie.

Nowa miara krok po kroku, pasek formuły i IntelliSense

Co chcemy osiągnąć. Łączna sprzedaż netto to liczba, od której zaczyna się prawie każdy raport Nordvelli: na kartach, na wykresach i w porównaniu z budżetem. Chcemy zbudować ją jako pierwszą miarę i sprawdzić jej wynik.

Zbudujmy pierwszą miarę Nordvella od zera. Chcemy policzyć łączną sprzedaż netto, czyli sumę kolumny WartoscNetto z tabeli faktów. Wykonaj to krok po kroku, obserwując co dzieje się na ekranie. Najpierw przygotuj miejsce na wizuale, które zbudujemy w drugiej połowie lekcji: w widoku raportu kliknij plus na pasku stron u dołu okna. Power BI doda pustą Stronę 3 i od razu ją otworzy, dlatego na zrzutach poniżej strona raportu jest pusta.

Krok 1. W panelu Dane po prawej kliknij prawym przyciskiem tabelę FaktSprzedaz. Otworzy się menu, w którym druga pozycja to Nowa miara. Kliknij ją. Ważne, żeby miara powstała w tabeli faktów, bo tam mieszkają dane liczbowe. Zamiast menu możesz też zaznaczyć tabelę i na wstążce kliknąć przycisk Nowa miara.

Power BI Desktop: menu kontekstowe tabeli FaktSprzedaz w panelu Dane z pozycją Nowa miara na pustej stronie raportu
Menu po kliknięciu prawym przyciskiem tabeli FaktSprzedaz. Pod pozycją Wybierz są trzy polecenia tworzenia: Nowa miara, Nowa kolumna i Nowa szybka miara. Strona raportu jest jeszcze pusta.

Tuż pod wstążką otwiera się pasek formuły z zaznaczonym tekstem Miara =. W panelu Dane, w tabeli FaktSprzedaz, pojawia się robocza pozycja Miara z ikoną kalkulatora, a wstążka przełącza się na kartę Narzędzia miar.

Pasek formuły Power BI z roboczym tekstem Miara = i nowa pozycja Miara w tabeli FaktSprzedaz w panelu Dane
Stan zaraz po kliknięciu Nowa miara. Tekst Miara = w pasku formuły jest zaznaczony, więc to, co wpiszesz, od razu go zastąpi. Po lewej stronie paska są dwa przyciski: krzyżyk (anuluj) i znaczek zatwierdzenia.

Krok 2. W pasku formuły wpisz nazwę miary, znak równości i pierwsze litery funkcji: Łączna sprzedaż = SUM. Już w trakcie pisania Power BI pokazuje listę funkcji, których nazwa zaczyna się od wpisanych liter. To podpowiedzi IntelliSense, czyli lista funkcji i kolumn wyświetlana na bieżąco.

IntelliSense w pasku formuły Power BI: po wpisaniu Łączna sprzedaż = SUM lista funkcji SUM, SUMMARIZE, SUMMARIZECOLUMNS, SUMX
Po wpisaniu SUM lista pokazuje cztery funkcje: SUM, SUMMARIZE, SUMMARIZECOLUMNS i SUMX. Dopasowana część nazwy jest podświetlona. Nas interesuje pierwsza pozycja, SUM.

Dopisz nawias otwierający, nazwę tabeli FaktSprzedaz i nawias kwadratowy otwierający, czyli SUM(FaktSprzedaz[. Lista zawęża się do kolumn tej jednej tabeli, a nad paskiem formuły pojawia się podpowiedź składni.

IntelliSense w Power BI po wpisaniu SUM(FaktSprzedaz[, lista kolumn tabeli FaktSprzedaz i podpowiedź SUM(ColumnName)
Lista kolumn FaktSprzedaz od CenaNetto w dół (WartoscNetto jest niżej, lista się przewija). Nad paskiem formuły Power BI przypomina składnię: SUM(ColumnName), Dodaje wszystkie liczby w kolumnie.

Dokończ wpisywanie nazwy kolumny WartoscNetto (albo kliknij ją na liście) i zamknij oba nawiasy. Cała formuła wygląda tak:

Łączna sprzedaż = SUM(FaktSprzedaz[WartoscNetto])

Krok 3. Naciśnij Enter. Robocza pozycja Miara w panelu Dane zmienia nazwę na Łączna sprzedaż i nadal ma ikonę kalkulatora. Ta ikona odróżnia miarę od zwykłej kolumny, która ma symbol sumy albo nie ma żadnej ikony. Miara nie pokazuje jeszcze żadnej liczby, bo nie ma jej gdzie policzyć. Potrzebuje wizualu albo zapytania, które nada jej kontekst.

Power BI po zatwierdzeniu miary Łączna sprzedaż: formuła SUM w pasku i miara z ikoną kalkulatora w tabeli FaktSprzedaz
Miara zatwierdzona. Na wstążce Narzędzia miar pole Nazwa pokazuje Łączna sprzedaż, Tabela główna to FaktSprzedaz, a Format ma na razie wartość Ogólne. Strona raportu nadal jest pusta.

Krok 4. Miara jest nadal zaznaczona, a na wstążce widać kartę Narzędzia miar. Kliknij w pole Format, wpisz własny ciąg #,0 "zł" i naciśnij Enter. To liczba całkowita z separatorem tysięcy i dopiskiem zł. Od tej chwili każda wartość tej miary w raporcie wyświetli się jako czytelna kwota, na przykład 467 775 009 zł zamiast surowego ciągu cyfr. Formatowanie ustawiasz raz na mierze, a nie osobno w każdym wizualu, co jest jedną z największych zalet miar.

Wstążka Narzędzia miar w Power BI: miara Łączna sprzedaż z własnym formatem #,0 zł i pusta strona raportu
Pole Format pokazuje teraz #,0 "zł". Przyciski waluty i procentu obok zrobiły się szare, bo format jest własny, a nie wybrany z listy. Strona raportu nadal jest pusta, wizual zbudujemy dopiero w następnej części lekcji.
Animacja tworzenia miary DAX Łączna sprzedaż: IntelliSense zawęża podpowiedzi, Enter, miara z kalkulatorem w panelu Dane
Cała droga od pustego paska formuły do miary Łączna sprzedaż = SUM( FaktSprzedaz[WartoscNetto] ). Po wpisaniu nazwy tabeli i nawiasu kwadratowego IntelliSense zostawia tylko kolumny FaktSprzedaz, a po Enterze miara pojawia się w panelu Dane z ikoną kalkulatora.

Krok 5. Wynik miary możesz sprawdzić bez wstawiania wizuala. Kliknij czwartą ikonę na pionowym pasku po lewej stronie okna, Widok zapytań języka DAX. W edytorze jest przykładowe zapytanie z komentarzami. Zaznacz cały tekst (Ctrl+A), wpisz w to miejsce EVALUATE ROW("Łączna sprzedaż", [Łączna sprzedaż]) i kliknij zielony przycisk Uruchom nad edytorem.

Widok zapytań języka DAX w Power BI: EVALUATE ROW z miarą Łączna sprzedaż i wynik 467775009.17 w panelu Wyniki
Panel Wyniki pod edytorem pokazuje jedną kolumnę [Łączna sprzedaż] i jeden wiersz: 467775009.17. Widok zapytań nie stosuje formatu miary, dlatego kwota ma grosze i kropkę zamiast separatora tysięcy. Pasek stanu na dole: Sukces, czas wykonania oraz 1 kolumna, 1 wiersz.

Tą samą metodą dołóż resztę bazowych miar, których użyjesz w całym kursie. Nazwy z polskimi znakami i spacjami są dozwolone, byle brać je w nawias kwadratowy przy odwołaniu. Zrzuty w dalszej części lekcji nagraliśmy przed dodaniem tych miar, dlatego w panelu Dane widać na nich tylko Łączna sprzedaż. U Ciebie lista w tabeli FaktSprzedaz będzie dłuższa.

Łączna sprzedaż = SUM(FaktSprzedaz[WartoscNetto])

Liczba transakcji = COUNTROWS(FaktSprzedaz)

Średnia wartość transakcji = AVERAGE(FaktSprzedaz[WartoscNetto])

Łączna marża = SUM(FaktSprzedaz[MarzaNetto])

Marża % = DIVIDE([Łączna marża], [Łączna sprzedaż], 0)

Liczba sklepów = DISTINCTCOUNT(FaktSprzedaz[SklepID])

Dwie rzeczy warto tu wychwycić. Po pierwsze, miara Marża % odwołuje się do dwóch wcześniejszych miar w nawiasach kwadratowych, a nie do surowych kolumn. To dobra praktyka, bo zmiana definicji sprzedaży czy marży w jednym miejscu propaguje się wszędzie. Po drugie, użyliśmy DIVIDE zamiast zwykłego dzielenia. DIVIDE ma trzeci argument, wartość zwracaną przy dzieleniu przez zero, dzięki czemu przy sprzedaży równej zero raport nie pokaże błędu, tylko 0. Sklep bez żadnej sprzedaży dostanie pustą komórkę: DIVIDE z pustym licznikiem i mianownikiem zwraca pustą wartość (sprawdziliśmy zapytaniem DAX).

Plik do pobrania: arkusz Nordvelli do odtworzenia demo, Nordvella_dane.xlsx. Wczytaj go u siebie, zbuduj powyższe miary krok po kroku i sprawdź, że sumy zgadzają się z liczbami w tym rozdziale.

Kontekst wiersza kontra kontekst filtra

Co chcemy osiągnąć. Ta sama miara Łączna sprzedaż pokazuje na karcie sumę całej sieci Nordvelli, a w tabeli osobną kwotę dla każdego regionu. Chcemy rozumieć, skąd bierze się ta różnica, bo od niej zależy poprawność każdej bardziej złożonej formuły w raporcie.

Kontekst to podstawa DAX: od niego zależy, co policzy każda trudniejsza formuła. W DAX istnieją dwa rodzaje kontekstu, czyli otoczenia, w którym liczy się formuła.

Kontekst wiersza odpowiada na pytanie „w którym wierszu jestem?”. Powstaje wtedy, gdy formuła liczy się osobno dla każdego wiersza tabeli, na przykład w kolumnie obliczeniowej: przy wierszu jednej transakcji formuła widzi wartości tylko tej transakcji. Kontekst filtra odpowiada na pytanie „które wiersze biorę pod uwagę?”. Tworzą go fragmentatory, wiersze i kolumny macierzy, filtry oraz relacje: ta sama miara w wierszu macierzy z Krakowem liczy się tylko na transakcjach z Krakowa. W skrócie: kontekst wiersza wskazuje jeden wiersz, kontekst filtra wybiera zbiór wierszy, na którym liczy się miara. Poniżej najpierw kontekst wiersza na kolumnie obliczeniowej, potem kontekst filtra na jednej mierze pokazanej w karcie i w macierzy.

Diagram kontekstów DAX: kontekst wiersza zna kolumny bieżącego wiersza, kontekst filtra to filtry z fragmentatorów i relacji
Dwa konteksty DAX obok siebie. Kontekst wiersza widzi jeden wiersz i jego kolumny, kontekst filtra to wszystkie nałożone filtry zawężające zbiór wierszy. Trzecia kolumna zapowiada przejście między nimi: CALCULATE zamienia kontekst wiersza w kontekst filtra, do czego wrócimy w lekcji o CALCULATE.

Kontekst wiersza

Kontekst wiersza (ang. row context) to sytuacja, w której DAX zna wartości wszystkich kolumn dokładnie jednego wiersza. Powstaje sam z siebie w kolumnie obliczeniowej, bo kolumna liczy się osobno dla każdego wiersza. Powstaje też wewnątrz funkcji iterujących, o których piszemy w kolejnych rozdziałach. Prześledź to na kolumnie obliczeniowej dopisanej do FaktSprzedaz.

Wartosc Brutto Sprawdzenie =
    FaktSprzedaz[Ilosc] * FaktSprzedaz[CenaNetto] * 1.23

Żeby zobaczyć to na ekranie, przejdź do widoku Dane (druga ikona na lewym pasku) i w panelu Dane kliknij tabelę FaktSprzedaz. Na wstążce kliknij kartę Narzędzia tabel, a w niej Nowa kolumna. W pasku formuły pojawi się zaznaczony szablon Kolumna = . Wpisz w to miejsce formułę z ramki powyżej i naciśnij Enter.

Widok Dane w Power BI: kolumna obliczeniowa Wartosc Brutto Sprawdzenie w FaktSprzedaz i jej formuła w pasku formuły
Nowa kolumna Wartosc Brutto Sprawdzenie jest na końcu tabeli. W pierwszym wierszu Ilosc to 1, a CenaNetto 2473,14, więc kolumna pokazuje 3041,9622, prawie tyle co źródłowa WartoscBrutto (3041,96). Pasek stanu: 108 675 wierszy i 96 887 odrębnych wartości.

W tej kolumnie DAX dla każdego z 108 675 wierszy bierze Ilosc i CenaNetto tego właśnie wiersza i mnoży. Nie musisz wskazywać, o który wiersz chodzi: formuła zawsze liczy się dla wiersza, który akurat przetwarza. Dlatego w kolumnie obliczeniowej odwołujesz się do kolumn bezpośrednio, a nie przez SUM, bo w danym momencie formuła widzi jedną wartość z jednego wiersza, a nie zbiór wartości do zsumowania.

Kontekst filtra

Kontekst filtra (ang. filter context) to zestaw wszystkich filtrów, które w danym momencie zawężają dane. Składają się na niego: wybór we fragmentatorze, kliknięcie w inny wizual, wiersz i kolumna macierzy oraz filtry przenoszone przez relacje w modelu. Miara zawsze liczy się w bieżącym kontekście filtra. Weź miarę Łączna sprzedaż. Wrzucona do karty bez żadnego podziału widzi wszystkie wiersze i pokazuje sumę całości. Wrzucona do macierzy z miastem na wierszach dostaje na każdy wiersz dodatkowy filtr po tym mieście i liczy się osobno dla Warszawy, osobno dla Krakowa, i tak dalej.

Miasto (kontekst filtra)Łączna sprzedaż
Warszawa222,8 mln zł
Kraków50,5 mln zł
Katowice33,0 mln zł
Suma (brak filtra miasta)467,78 mln zł

Wskazówka: zapamiętaj jedno zdanie. Kolumna obliczeniowa działa w kontekście wiersza, miara działa w kontekście filtra. Dlatego kolumna nie reaguje na fragmentator (jest już policzona), a miara reaguje zawsze. To jedno rozróżnienie tłumaczy większość pytań w stylu dlaczego moja liczba się nie zmienia albo dlaczego nagle liczy się dla całości.

Ta sama miara w karcie i w macierzy

Co chcemy osiągnąć. Chcemy zobaczyć na stronie raportu, jak jedna miara Łączna sprzedaż daje na karcie wynik całej sieci Nordvelli, a w macierzy osobne kwoty dla regionów.

Najlepiej poczuć kontekst filtra na jednej mierze pokazanej w dwóch wizualach na tej samej stronie. Zbudujemy to na Nordvelli. Weź miarę Łączna sprzedaż i wrzuć ją najpierw do karty, a potem do macierzy z podziałem na region. Wróć do widoku raportu (pierwsza ikona na lewym pasku) i sprawdź, czy na pasku stron u dołu okna zaznaczona jest Strona 3, którą dodałeś na początku lekcji. Na niej zbudujemy oba wizuale.

Karta. W panelu Wizualizacje najedź kursorem na ikonę z kartą. Podpowiedź pokazuje jej nazwę: Karta. Kliknij ją.

Panel Wizualizacje w Power BI Desktop z podpowiedzią Karta nad ikoną wizuala i pusta strona raportu
Ikona Karta w czwartym wierszu panelu Wizualizacje. Nazwę wizuala zawsze sprawdzisz w podpowiedzi po najechaniu kursorem.

W lewym górnym rogu strony pojawia się pusta karta z napisem Zaznacz lub przeciągnij pola, aby wypełnić tę wizualizację. Pod ikonami panelu Wizualizacje widać trzy obszary na pola: Wartość, Kategorie i Etykietki.

Pusta karta na stronie raportu Power BI i obszary Wartość, Kategorie oraz Etykietki w panelu Wizualizacje
Pusta karta jest zaznaczona (ma uchwyty na rogach). Obszary Wartość, Kategorie i Etykietki czekają na pola.

Przeciągnij miarę Łączna sprzedaż z panelu Dane (tabela FaktSprzedaz) do obszaru Wartość. Nie ma żadnego podziału, więc kontekst filtra jest pusty, a miara widzi wszystkie transakcje. Karta pokazuje jedną liczbę: łączną sprzedaż netto całej sieci, zaokrągloną do 468 mln zł. Pełną kwotę zobaczysz za chwilę w wierszu Suma macierzy.

Karta w Power BI z miarą Łączna sprzedaż: 468 mln zł, miara w obszarze Wartość i zaznaczona w panelu Dane
Karta liczy miarę dla całego modelu: 468 mln zł. W obszarze Wartość siedzi Łączna sprzedaż, Kategorie i Etykietki zostają puste, a przy mierze w panelu Dane pojawił się znaczek zaznaczenia.

Macierz. Kliknij puste miejsce strony, żeby odznaczyć kartę. W panelu Wizualizacje najedź kursorem na ikonę z podpowiedzią Macierz i kliknij ją.

Panel Wizualizacje w Power BI z podpowiedzią Macierz nad ikoną i karta 468 mln zł na stronie raportu
Ikona Macierz w piątym wierszu panelu, obok ikony Tabela. Karta na stronie nie jest już zaznaczona.

Pod kartą pojawia się pusta macierz, a obszary w panelu zmieniają się na Wiersze, Kolumny i Wartości.

Pusta macierz pod kartą w Power BI i obszary Wiersze, Kolumny oraz Wartości w panelu Wizualizacje
Nowa macierz jest zaznaczona i jeszcze pusta. Karta nad nią dalej pokazuje 468 mln zł.

W panelu Dane rozwiń tabelę DimSklepy i przeciągnij pole Region do obszaru Wiersze. Macierz wypisuje sześć regionów, na razie bez liczb.

Macierz w Power BI z polem Region z DimSklepy w obszarze Wiersze: sześć regionów Nordvelli jeszcze bez wartości
Region w obszarze Wiersze. Macierz pokazuje Centrum, Online, Południe, Północ, Wschód i Zachód, w kolejności alfabetycznej.

Rozwiń z powrotem FaktSprzedaz i przeciągnij tę samą miarę Łączna sprzedaż do obszaru Wartości. Teraz każdy wiersz macierzy nakłada filtr po swoim regionie, więc jedna definicja miary daje różne wyniki. Wiersz Suma na dole macierzy nie ma filtra regionu, dlatego pokazuje tę samą kwotę co karta.

Karta i macierz w Power BI z tą samą miarą Łączna sprzedaż: 468 mln zł i rozbicie na sześć regionów z sumą
Oba wizuale na jednej stronie. W obszarach macierzy: Region w Wierszach i Łączna sprzedaż w Wartościach.
Zbliżenie karty 468 mln zł i macierzy Łączna sprzedaż według regionów Nordvelli z wierszem Suma 467 775 009 zł
Zbliżenie tych samych wizuali. Macierz: Centrum 100 215 908 zł, Online 141 772 849 zł, Południe 83 460 430 zł, Północ 45 186 972 zł, Wschód 28 411 149 zł, Zachód 68 727 702 zł. Suma 467 775 009 zł to dokładnie ta kwota, którą karta zaokrągla do 468 mln zł. Miara nie zmieniła się ani o znak, zmienił się tylko kontekst, w którym ją policzono.
WizualKontekst filtraWynik miary
KartaBrak podziału467,78 mln zł (całość)
Macierz, wiersz Region PołudnieFiltr Region = Południetylko sprzedaż tego regionu
Macierz, wiersz Region PółnocFiltr Region = Północtylko sprzedaż tego regionu
Macierz, wiersz sumyBrak filtra regionu467,78 mln zł (całość)

Kontekst filtra dokłada też fragmentator. Poniższy zrzut pochodzi z naszego pliku demonstracyjnego: taki sam układ karty i macierzy, a pod nimi fragmentator z polem Miasto z tabeli DimSklepy, w którym zaznaczyliśmy Kraków. Fragmentatory budujemy krok po kroku w następnej lekcji (tam na polu Rok), więc tutaj patrzymy tylko na efekt.

Fragmentator miast w Power BI z zaznaczonym Krakowem oraz karta i macierz przeliczone do 50 mln zł sprzedaży
Jedno kliknięcie we fragmentatorze i ta sama miara liczy co innego. Karta spada z 468 mln zł do 50 mln zł, a macierz zwija się do jednego wiersza: Południe, 50 479 567 zł. Pozostałe regiony nie są ukryte - one po prostu nie mają już żadnych wierszy do policzenia, bo oba krakowskie sklepy leżą w regionie Południe. To jest kontekst filtra w jednym obrazku.

Nie piszesz osobnej formuły dla każdego regionu ani dla całości. Piszesz raz Łączna sprzedaż, a Power BI wykonuje ten sam wzór tyle razy, ile jest komórek wizualu, za każdym razem w innym kontekście filtra. Kolumna obliczeniowa nie potrafi tego zrobić, bo jej wartości są zamrożone przy odświeżaniu i nie znają fragmentatorów.

Wskazówka: gdy raport pokazuje w każdym wierszu tę samą liczbę zamiast rozbicia, prawie zawsze przyczyną jest użycie kolumny obliczeniowej tam, gdzie powinna być miara, albo pole użyte jako suma bez agregacji. Wróć do panelu Dane i sprawdź ikonę: kalkulator oznacza miarę, ikona kolumny oznacza kolumnę.

Funkcje logiczne, IF, SWITCH i DIVIDE

Co chcemy osiągnąć. Zarząd Nordvelli chce widzieć przy każdym sklepie nie tylko kwoty, ale też jego segment wielkości i ocenę marży. Chcemy zbudować takie miary funkcjami IF, SWITCH i DIVIDE.

Same sumy to za mało. W raportach Nordvella chcesz klasyfikować sklepy i oceniać realizację planu. Do tego służą funkcje logiczne. IF zwraca jedną z dwóch wartości w zależności od warunku, SWITCH zastępuje długi łańcuch zagnieżdżonych IF, a DIVIDE bezpiecznie dzieli. Zacznij od miary, która dzieli sklepy na segmenty według sprzedaży.

Segment Sklepu =
IF(
    [Łączna sprzedaż] > 5000000, "Duży",
    IF([Łączna sprzedaż] > 2000000, "Średni", "Mały")
)

Wrzuć tę miarę do nowej, tymczasowej macierzy z polem Nazwa z tabeli DimSklepy na wierszach, obok macierzy z regionami (po obejrzeniu możesz ją usunąć). Każdy wiersz liczy się w kontekście filtra jednego sklepu, więc etykieta powstaje osobno dla każdego z nich. Na danych Nordvelli zobaczysz jednak wszędzie Duży: najmniejszy sklep, Nordvella Białystok, sprzedał za 12,3 mln zł, czyli ponad dwa razy więcej niż górny próg 5 mln zł. Progi trzeba dobrać do danych, a nie wpisać z głowy. Gdy dochodzi przy tym trzeci i czwarty poziom, zagnieżdżone IF stają się nieczytelne. Wtedy sięgasz po SWITCH z argumentem TRUE, który sprawdza warunki po kolei i zwraca pierwszy pasujący. Tak wygląda miara Klasa sklepu z progami ustawionymi na podstawie sprzedaży sklepów Nordvelli. Pokazujemy ją na naszym pliku demonstracyjnym, w pliku efektu tej lekcji jej nie ma:

Klasa sklepu =
SWITCH(
    TRUE(),
    [Łączna sprzedaż] >= 100000000, "Bardzo duży",
    [Łączna sprzedaż] >= 30000000, "Duży",
    [Łączna sprzedaż] >= 18000000, "Średni",
    "Mały"
)
Tabela piętnastu sklepów Nordvelli w Power BI z miarą klasyfikującą SWITCH: klasa sklepu i łączna sprzedaż
SWITCH z TRUE() czyta się jak lista warunków od góry i tak też działa: pierwszy próg, który pasuje, wygrywa. Miara Klasa sklepu na zrzucie ma progi 100 mln zł dla Bardzo duży, 30 mln zł dla Duży i 18 mln zł dla Średni, a wszystko poniżej to Mały. Białystok z 12,3 mln jest Mały, Katowice z 33,0 mln to Duży, a Nordvella Online ze 141,8 mln jako jedyny dostaje Bardzo duży. Zwróć uwagę na ostatni wiersz: suma też dostała etykietę, bo miara policzyła się również dla niej. Klasa całej sieci nie znaczy nic sensownego i w prawdziwym raporcie warto ją wyłączyć.

Ten sam zapis sprawdza się przy ocenie marży. Miara poniżej przypisuje każdej kategorii produktów słowną ocenę na podstawie miary Marża %. Wrzucona do macierzy z polem Kategoria z tabeli DimProdukty pokaże, które grupy trzymają marżę, a które ją zjadają.

Ocena Marzy =
SWITCH(
    TRUE(),
    [Marża %] >= 0.30, "Bardzo dobra",
    [Marża %] >= 0.20, "Dobra",
    [Marża %] >= 0.10, "Przeciętna",
    "Niska"
)

Zostaje DIVIDE. Na zrzucie poniżej, także z naszego pliku demonstracyjnego, porównujemy dwie miary średniej oceny z ankiet satysfakcji (to ilustracja, w swoim pliku ich nie zakładasz). Liczą to samo, różnią się tylko sposobem dzielenia:

Ocena ukośnikiem = SUM(FaktSatysfakcja[OcenaOgolna]) / COUNTROWS(FaktSatysfakcja)

Ocena przez DIVIDE = DIVIDE(SUM(FaktSatysfakcja[OcenaOgolna]), COUNTROWS(FaktSatysfakcja))
Macierz w Power BI porównująca ocenę liczoną ukośnikiem i funkcją DIVIDE dla piętnastu sklepów Nordvelli
Ten sam rachunek zapisany na dwa sposoby i wiersz, który wszystko tłumaczy. Nordvella Online sprzedaje za 141,8 mln zł, ale nie zbiera ankiet satysfakcji, więc mianownik jest pusty - i obie kolumny pokazują pustkę, nie błąd. To ważne rozróżnienie: DAX dzieli przez pustkę bez protestu. DIVIDE ratuje Cię dopiero wtedy, gdy mianownik wynosi dokładnie zero, bo wtedy zapis z ukośnikiem zwraca nieskończoność albo błąd, a DIVIDE oddaje czystą komórkę. Pusto i zero to w DAX dwie różne sytuacje.

Częste błędy składni DAX

Co chcemy osiągnąć. Przy pisaniu miar dla Nordvelli łatwo o pomyłkę w składni. Chcemy rozpoznawać pięć błędów, które łapią prawie każdego początkującego, i wiedzieć, jak każdy z nich poprawić.

Na koniec pięć błędów, które łapią prawie każdego początkującego. Poniższy blok pokazuje wersję błędną i poprawioną obok siebie, żeby rozpoznać wzorzec pomyłki, a nie tylko pojedynczy przypadek.

Pasek formuły DAX w Power BI z błędem składni: SUM bez nazwy tabeli, czerwone podkreślenie i komunikat o błędzie
Typowy błąd początkującego i reakcja Power BI. W formule SUM(WartoscNetto) brakuje nazwy tabeli, więc DAX nie wie, o którą kolumnę chodzi - kolumny o tej samej nazwie mogą leżeć w kilku tabelach naraz. Nazwa jest podkreślona czerwoną falą, pod paskiem formuły jest komunikat "Funkcja SUM akceptuje jako argument tylko odwołanie do kolumny", a zielony znaczek zatwierdzenia jest wyszarzony. Poprawny zapis to SUM(FaktSprzedaz[WartoscNetto]) - zawsze tabela, potem kolumna w nawiasie kwadratowym.
Komunikat błędu w Power BI o kolumnie bez agregacji w formule miary DAX
Drugi klasyk: miara, która wskazuje kolumnę, ale nie mówi, co z nią zrobić. Power BI tłumaczy to wprost - nie można określić pojedynczej wartości dla kolumny zawierającej wiele wartości bez agregacji. Miara musi zwrócić jedną liczbę dla bieżącego kontekstu, a kolumna WartoscNetto ma ich 108 675. Lekarstwem jest owinięcie kolumny w funkcję agregującą: SUM, AVERAGE, MIN, MAX albo COUNT, zależnie od tego, o co pytasz.
// 1. SUM na dwóch kolumnach naraz (nie zadziała)
// BŁĄD: SUM oczekuje JEDNEJ kolumny
Iloczyn kolumn bez SUMX = SUM(FaktSprzedaz[Ilosc] * FaktSprzedaz[CenaNetto])
// DOBRZE: iterator liczy wiersz po wierszu, potem sumuje
Iloczyn kolumn przez SUMX = SUMX(FaktSprzedaz, FaktSprzedaz[Ilosc] * FaktSprzedaz[CenaNetto])

// 2. Odwołanie do kolumny wprost w mierze (bez agregacji)
// BŁĄD: miara nie ma kontekstu wiersza, nie wie który wiersz
Kolumna bez agregacji = FaktSprzedaz[WartoscNetto]
// DOBRZE: opakuj w funkcję agregującą
Kolumna z agregacją = SUM(FaktSprzedaz[WartoscNetto])

// 3. Mylenie nawiasów: kolumna [ ], miara [ ], funkcja ( )
// BŁĄD: kolumna w nawiasach okrągłych
Nawias okrągły zamiast kwadratowego = SUM(FaktSprzedaz(WartoscNetto))
// DOBRZE: kolumna zawsze w nawiasach kwadratowych z nazwą tabeli
Poprawne odwołanie do kolumny = SUM(FaktSprzedaz[WartoscNetto])

// 4. Dzielenie zwykłym / (dzielenie przez zero psuje raport)
// BŁĄD: sklep bez sprzedaży zwróci nieskończoność lub błąd
Dzielenie ukośnikiem = [Łączna marża] / [Łączna sprzedaż]
// DOBRZE: DIVIDE z trzecim argumentem na wypadek zera
Dzielenie przez DIVIDE = DIVIDE([Łączna marża], [Łączna sprzedaż], 0)

// 5. Odwołanie do miary z nazwą tabeli (działa, ale myli)
// ZŁA PRAKTYKA: zapis wygląda jak odwołanie do kolumny
Miara z nazwą tabeli = FaktSprzedaz[Łączna sprzedaż] * 1.23
// DOBRZE: miarę bierzesz w nawias kwadratowy BEZ nazwy tabeli
Miara bez nazwy tabeli = [Łączna sprzedaż] * 1.23

Reguła, która porządkuje pierwsze cztery przypadki, jest prosta. Kolumnę zapisujesz jako Tabela w nawiasie kwadratowym z nazwą kolumny, na przykład FaktSprzedaz w nawiasie z WartoscNetto. Miarę zapisujesz w samym nawiasie kwadratowym, bez nazwy tabeli. Zapis z nazwą tabeli Power BI przyjmie, ale miara wygląda wtedy jak kolumna i łatwo je pomylić. Gdy potrzebujesz policzyć coś wiersz po wierszu i dopiero zsumować, zamiast SUM użyj wersji z X na końcu, czyli SUMX, która tworzy kontekst wiersza i iteruje.

Wskazówka: gdy pasek formuły podkreśla fragment na czerwono i pokazuje komunikat, przeczytaj go dosłownie. Komunikat w stylu kolumna WartoscNetto nie została znaleziona najczęściej oznacza literówkę w nazwie albo odwołanie do kolumny, która jest w innej tabeli. Napisz nazwę tabeli i pozwól, żeby IntelliSense sam podpowiedział poprawną kolumnę, zamiast wpisywać ją z pamięci.

Masz komplet podstaw. Umiesz odróżnić miarę od kolumny, zbudować miarę krok po kroku, rozumiesz różnicę między kontekstem wiersza a kontekstem filtra i widzisz, dlaczego jedna miara daje różne liczby w karcie i w macierzy. W następnej lekcji użyjesz tych miar w wizualizacjach. Na tym fundamencie opierają się też dwie późniejsze lekcje o DAX: DAX: CALCULATE i kontekst filtrów, gdzie celowo zmieniasz kontekst filtra, oraz DAX: iteratory i miary zaawansowane, gdzie wraca SUMX z błędu numer jeden.

✕

Najczęściej zadawane pytania

Czym różni się miara od kolumny obliczeniowej w DAX?
Kolumna obliczeniowa liczy się raz, przy odświeżaniu danych, dla każdego wiersza tabeli i zajmuje miejsce w modelu. Miara liczy się na żywo, dopiero gdy patrzysz na wizual, w bieżącym kontekście filtra, i nie przechowuje wartości. Do sum, procentów i wskaźników reagujących na fragmentatory używaj miary, do stałych etykiet na wierszu (kategoria wagowa, pełna nazwa) używaj kolumny.
Co to jest kontekst wiersza, a co kontekst filtra w DAX?
Kontekst wiersza to bieżący wiersz, w którym DAX zna wartości wszystkich kolumn tego wiersza. Powstaje sam w kolumnie obliczeniowej i w funkcjach iterujących jak SUMX. Kontekst filtra to zestaw filtrów nałożonych przez fragmentatory, kliknięcia, wiersze macierzy i relacje. Miara zawsze liczy się w bieżącym kontekście filtra, dlatego ta sama miara daje inną liczbę w karcie i w każdym wierszu macierzy.
Dlaczego ta sama miara pokazuje różne liczby w karcie i w macierzy?
Bo miara nie ma zapisanej wartości, tylko wzór. Karta bez podziału widzi całość, więc pokazuje sumę wszystkich transakcji Nordvella. Macierz z miastem na wierszach nakłada na każdy wiersz filtr po tym mieście, więc miara liczy się osobno dla Warszawy, Krakowa i reszty. To ten sam wzór wykonany w różnych kontekstach filtra.
Jakie błędy składni DAX zdarzają się najczęściej na początku?
Najczęściej myli się zapis kolumny i miary: kolumnę piszesz jako nazwę tabeli z nazwą kolumny w nawiasie kwadratowym, a miarę w samym nawiasie kwadratowym. Drugi częsty błąd to SUM tam, gdzie trzeba liczyć wiersz po wierszu, czyli SUMX. Komunikat o nieznalezionej kolumnie zwykle oznacza literówkę albo kolumnę z innej tabeli.

Komentarze (0)

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

Brak komentarzy...