Ściąga Power BI
Ostatnia aktualizacja
Miary, kolumny i tabele
Miara jest obliczana dla każdej komórki wizualizacji; kolumna obliczeniowa jest obliczana raz dla każdego wiersza i zapisywana.
| Co robi | DAX |
|---|---|
| Utworzenie miary | Total Sales = SUM ( Sales[Amount] ) |
| Utworzenie kolumny obliczeniowej (jedna wartość na wiersz) | Line Total = Sales[Quantity] * Sales[Unit Price] |
| Utworzenie tabeli obliczeniowej | Top Customers = TOPN ( 10, Customer, [Total Sales] ) |
| Odwołanie do kolumny: nazwa tabeli, potem kolumna w nawiasach kwadratowych | Sales[Amount] |
| Nazwa tabeli w apostrofach, gdy zawiera spację albo jest słowem zastrzeżonym | 'Date'[Date] |
| Odwołanie do miary: same nawiasy kwadratowe | [Total Sales] |
| Użycie miary w innej mierze | Average Price = DIVIDE ( [Total Sales], [Total Units] ) |
Funkcje agregujące
Każda z nich podsumowuje kolumnę w bieżącym kontekście filtru.
| Co robi | DAX |
|---|---|
| Suma kolumny | SUM ( Sales[Amount] ) |
| Średnia kolumny | AVERAGE ( Sales[Amount] ) |
| Najmniejsza wartość | MIN ( Sales[Order Date] ) |
| Największa wartość | MAX ( Sales[Order Date] ) |
| Liczba wierszy tabeli | COUNTROWS ( Sales ) |
| Liczba niepustych wartości kolumny | COUNT ( Sales[Amount] ) |
| Liczba unikatowych wartości | DISTINCTCOUNT ( Sales[Customer Key] ) |
| Bezpieczne dzielenie: pusta wartość zamiast błędu, gdy mianownik to 0 | DIVIDE ( [Total Sales], [Total Units] ) |
| Dzielenie z wartością pokazywaną, gdy mianownik to 0 | DIVIDE ( [Profit], [Total Sales], 0 ) |
Iteratory (funkcje X)
Przechodzą przez tabelę wiersz po wierszu, obliczają wyrażenie dla każdego wiersza, a potem agregują wyniki.
| Co robi | DAX |
|---|---|
| Mnożenie w każdym wierszu, potem suma | SUMX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| Średnia z wyniku obliczonego dla każdego wiersza | AVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| Największy wynik obliczony dla wiersza | MAXX ( Sales, Sales[Quantity] * Sales[Unit Price] ) |
| Średnia miary na klienta | AVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] ) |
| Kolumna z powiązanej tabeli w wyrażeniu | SUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) ) |
| Liczba wierszy spełniających warunek | COUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) ) |
| Ranking każdego produktu według miary | RANKX ( ALL ( Product[Product] ), [Total Sales] ) |
| Ranking bez luk po remisach (1, 1, 2) | RANKX ( ALL ( Product[Product] ), [Total Sales], , DESC, DENSE ) |
| Połączenie wartości w jeden tekst | CONCATENATEX ( VALUES ( Product[Category] ), Product[Category], ", " ) |
CALCULATE i funkcje filtrów
CALCULATE oblicza wyrażenie ze zmienionymi filtrami. Filtr na tej samej kolumnie zastępuje poprzedni; filtry na różnych kolumnach łączą się przez AND.
| Co robi | DAX |
|---|---|
| Filtr na jedną wartość | CALCULATE ( [Total Sales], Product[Category] = "Bikes" ) |
| Filtr na listę wartości | CALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } ) |
| Dwa filtry (AND) | CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" ) |
| OR na dwóch kolumnach | CALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) ) |
| Filtr według miary | CALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| Zachowanie istniejącego filtru i część wspólna z nim | CALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) ) |
| Usunięcie filtrów z kolumny | CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) |
| Usunięcie wszystkich filtrów z tabeli | CALCULATE ( [Total Sales], ALL ( Product ) ) |
| Usunięcie wszystkich filtrów z tabeli oprócz wybranych kolumn | CALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) ) |
| Zachowanie wyboru we fragmentatorach bez wierszy samej wizualizacji | CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) |
| Użycie nieaktywnej relacji | CALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) ) |
| Filtr płynący w obie strony dla jednej miary | CALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) ) |
| Filtr według tabeli bez relacji | CALCULATE ( [Total Sales], TREATAS ( VALUES ( Budget[Category] ), Product[Category] ) ) |
Analiza czasowa
Te funkcje wymagają tabeli dat: jeden wiersz na dzień, bez luk, oznaczonej jako tabela dat.
| Co robi | DAX |
|---|---|
| Od początku roku | TOTALYTD ( [Total Sales], 'Date'[Date] ) |
| Od początku roku, rok obrachunkowy kończy się 30 czerwca | TOTALYTD ( [Total Sales], 'Date'[Date], "6/30" ) |
| Od początku roku wewnątrz CALCULATE | CALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) ) |
| Od początku kwartału | TOTALQTD ( [Total Sales], 'Date'[Date] ) |
| Od początku miesiąca | TOTALMTD ( [Total Sales], 'Date'[Date] ) |
| Ten sam okres w poprzednim roku | CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) |
| Przesunięcie dat o interwał (tu o miesiąc wstecz) | CALCULATE ( [Total Sales], DATEADD ( 'Date'[Date], -1, MONTH ) ) |
| Cały poprzedni miesiąc | CALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) ) |
| Cały okres sprzed roku | CALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) ) |
| Ostatnie 12 miesięcy do ostatniej widocznej daty | CALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) ) |
| Stały zakres dat | CALCULATE ( [Total Sales], DATESBETWEEN ( 'Date'[Date], DATE ( 2025, 1, 1 ), DATE ( 2025, 3, 31 ) ) ) |
Popularne wzorce miar
Skopiuj, a potem zmień nazwy tabel i kolumn na te z twojego modelu.
| Co robi | DAX |
|---|---|
| Procent wszystkich kategorii | Category % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) ) |
| Procent tego, co zostawiają fragmentatory | Visible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) ) |
| Wzrost rok do roku | YoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear ) |
| Suma narastająca przez cały okres | Running Total = CALCULATE ( [Total Sales], FILTER ( ALL ( 'Date'[Date] ), 'Date'[Date] <= MAX ( 'Date'[Date] ) ) ) |
| Średnia krocząca z 7 dni (na dzień ze sprzedażą) | Sales 7 Day Avg = AVERAGEX ( DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -7, DAY ), [Total Sales] ) |
| Wartość pokazywana tylko dla pierwszej piątki | Top 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] ) |
| Liczba klientów powyżej progu | Big Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) ) |
| Suma, która zgadza się z sumą wierszy | Bonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] ) |
| Wartość tylko na jednym poziomie macierzy | Category Rank = IF ( ISINSCOPE ( Product[Category] ), RANKX ( ALL ( Product[Category] ), [Total Sales] ) ) |
| Saldo zamknięcia: ostatnia data, która ma wartość | Closing Units = CALCULATE ( SUM ( Inventory[Units] ), LASTNONBLANK ( 'Date'[Date], CALCULATE ( SUM ( Inventory[Units] ) ) ) ) |
Funkcje logiczne i informacyjne
Do warunków i do sprawdzania, co zawiera kontekst filtru.
| Co robi | DAX |
|---|---|
| Jeden warunek | IF ( [Total Sales] > 1000, "High", "Low" ) |
| Kilka wartości jednego wyrażenia | SWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" ) |
| Przedziały sprawdzane od góry do dołu | SWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" ) |
| AND i OR | IF ( Sales[Quantity] > 2 && Sales[Amount] > 50, "Big", "Small" ) |
| Czy wartość jest pusta? | ISBLANK ( [Total Sales] ) |
| Pierwsza niepusta wartość | COALESCE ( [Total Sales], 0 ) |
| Czy filtr zostawia dokładnie jedną wartość? | HASONEVALUE ( Product[Category] ) |
| Ta jedna wartość albo wartość domyślna | SELECTEDVALUE ( Product[Category], "All categories" ) |
| Czy ten wiersz wizualizacji jest grupowany według kolumny? | ISINSCOPE ( Product[Category] ) |
| Zwrócenie pustej wartości | BLANK () |
Funkcje tekstowe
Operator & łączy tekst; FORMAT zamienia liczbę lub datę na tekst.
| Co robi | DAX |
|---|---|
| Łączenie tekstu | Customer[First Name] & " " & Customer[Last Name] |
| Formatowanie liczby | FORMAT ( [Total Sales], "#,0.00" ) |
| Formatowanie daty | FORMAT ( 'Date'[Date], "mmm yyyy" ) |
| Pierwsze znaki | LEFT ( Product[Code], 3 ) |
| Znaki od podanej pozycji | MID ( Product[Code], 4, 2 ) |
| Długość | LEN ( Product[Name] ) |
| Wielkie litery | UPPER ( Store[City] ) |
| Usunięcie zbędnych spacji | TRIM ( Customer[Name] ) |
| Zamiana tekstu | SUBSTITUTE ( Customer[Phone], " ", "" ) |
| Pozycja tekstu bez rozróżniania wielkości liter (0, gdy go nie ma) | SEARCH ( "pro", Product[Name], 1, 0 ) |
Funkcje dat
Daty są pod spodem liczbami, więc odejmując je, dostajesz liczbę dni.
| Co robi | DAX |
|---|---|
| Dzisiejsza data | TODAY () |
| Utworzenie daty | DATE ( 2025, 12, 31 ) |
| Rok z daty | YEAR ( 'Date'[Date] ) |
| Numer miesiąca | MONTH ( 'Date'[Date] ) |
| Dzień tygodnia, poniedziałek jako 1 | WEEKDAY ( 'Date'[Date], 2 ) |
| Numer tygodnia, tygodnie od poniedziałku | WEEKNUM ( 'Date'[Date], 2 ) |
| Ostatni dzień miesiąca | EOMONTH ( 'Date'[Date], 0 ) |
| Ten sam dzień miesiąc wcześniej | EDATE ( 'Date'[Date], -1 ) |
| Liczba dni między dwiema datami | DATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY ) |
| Tabela dat ze stałych dat | CALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) ) |
| Tabela dat z dat w modelu | CALENDARAUTO () |
Relacje i wyszukiwanie
RELATED idzie wzdłuż relacji od strony wiele do strony jeden.
| Co robi | DAX |
|---|---|
| Wartość ze strony jeden (w kolumnie tabeli Sales) | RELATED ( Product[Category] ) |
| Wiersze strony wiele dla bieżącego wiersza (w kolumnie tabeli Customer) | COUNTROWS ( RELATEDTABLE ( Sales ) ) |
| Wyszukanie wartości bez relacji | LOOKUPVALUE ( Product[Price], Product[SKU], Sales[SKU] ) |
| Ścieżka od rodzica do dziecka (dla hierarchii i zabezpieczeń na poziomie wiersza) | PATH ( Employee[Employee ID], Employee[Manager ID] ) |
| Zalogowany użytkownik, dla dynamicznych zabezpieczeń na poziomie wiersza | USERPRINCIPALNAME () |
Funkcje tabelaryczne
Zwracają tabele: używaj ich w tabeli obliczeniowej, wewnątrz CALCULATE albo w iteratorze.
| Co robi | DAX |
|---|---|
| Unikatowe wartości w bieżącym filtrze | VALUES ( Product[Category] ) |
| Wiersze spełniające warunek | FILTER ( Product, Product[Price] > 100 ) |
| N pierwszych wierszy według miary | TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) |
| Grupowanie według kolumn i dodanie miar | SUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] ) |
| Dodanie kolumny do tabeli | ADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] ) |
| Wybór kolumn i zmiana ich nazw | SELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] ) |
| Lista liczb | GENERATESERIES ( 1, 10, 1 ) |
| Wszystkie kombinacje dwóch tabel | CROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) ) |
| Złożenie jedna pod drugą dwóch tabel o tych samych kolumnach | UNION ( 'Sales 2024', 'Sales 2025' ) |
Zmienne
VAR nadaje nazwę krokowi i oblicza go raz; RETURN zwraca wynik.
| Co robi | DAX |
|---|---|
| Jedna zmienna | Margin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue ) |
| Kilka zmiennych | Sales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY |
| Tabela w zmiennej | Top 5 Total = VAR Top5 = TOPN ( 5, ALL ( Product[Product] ), [Total Sales] ) RETURN CALCULATE ( [Total Sales], Top5 ) |
Kroki Power Query (M)
Power Query przekształca dane przed załadowaniem. To formuły M, które stoją za najczęściej używanymi przyciskami.
| Co robi | M |
|---|---|
| Zachowanie pasujących wierszy | Table.SelectRows(Source, each [Status] = "Paid") |
| Usunięcie kolumn | Table.RemoveColumns(Source, {"Notes", "Temp"}) |
| Ustawienie typów kolumn | Table.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}}) |
| Zmiana nazwy kolumny | Table.RenameColumns(Source, {{"amt", "Amount"}}) |
| Dodanie kolumny | Table.AddColumn(Source, "Total", each [Quantity] * [Price], type number) |
| Scalenie dwóch zapytań (join) | Table.NestedJoin(Sales, {"ProductID"}, Products, {"ProductID"}, "Product", JoinKind.LeftOuter) |
| Dołączenie zapytań (jedno pod drugim) | Table.Combine({Sales2024, Sales2025}) |
| Anulowanie przestawienia kolumn (kolumny na wiersze) | Table.UnpivotOtherColumns(Source, {"Product"}, "Month", "Amount") |
| Grupowanie i agregacja | Table.Group(Source, {"Category"}, {{"Sales", each List.Sum([Amount]), type number}}) |
| Zamiana błędów na wartość | Table.ReplaceErrorValues(Source, {{"Amount", 0}}) |
Ta ściąga z Power BI zbiera na jednej stronie DAX, który piszesz najczęściej: agregacje, iteratory X, CALCULATE i funkcje zmieniające filtry, analizę czasową, funkcje tekstowe i funkcje dat oraz wzorce miar do skopiowania, takie jak procent całości, wzrost rok do roku i suma narastająca.
Przykłady korzystają z modelu sprzedaży z tabelami Sales, Product, Customer i 'Date'; zmień ich nazwy na te ze swojego modelu. Cały DAX przeszedł przez parser silnika, na którym działa kurs Power BI w Coddy. Tam możesz go pisać w obszarze roboczym Power BI w przeglądarce i od razu sprawdzać.
Ściąga z Power BI: najczęstsze pytania
Czy ta ściąga z Power BI jest darmowa?
Tak. Czytaj ją tutaj albo dodaj do zakładek; nie trzeba się rejestrować.
Czym różni się miara od kolumny obliczeniowej?
Kolumna obliczeniowa jest obliczana raz dla każdego wiersza podczas odświeżania i zapisywana, więc możesz według niej filtrować fragmentatorem. Miara jest obliczana dla każdej komórki wizualizacji, z filtrami tej komórki, i niczego nie zapisuje. Sumy i wskaźniki powinny być miarami.
Co robi CALCULATE?
Oblicza wyrażenie ze zmienionymi filtrami: dodaje, zastępuje albo usuwa filtry, a potem oblicza wynik. Większość DAX wykraczającego poza proste sumy to CALCULATE z odpowiednimi argumentami filtrów.
Dlaczego DIVIDE zamiast operatora /?
DIVIDE zwraca pustą wartość (albo wybraną przez ciebie wartość), gdy mianownik jest zerem lub jest pusty. Operator / zwraca wtedy nieskończoność albo wartość błędu, która pojawia się na wizualizacjach.Czy do analizy czasowej potrzebuję tabeli dat?
TOTALYTD i SAMEPERIODLASTYEAR potrzebują tabeli z jednym wierszem na dzień, bez luk i z pełnymi latami, powiązanej z tabelami faktów i oznaczonej jako tabela dat.Czy ten DAX działa w Power Pivot w Excelu i w Analysis Services?
Język DAX jest wspólny, więc prawie wszystko działa także tam. Niektóre nowsze funkcje trafiają najpierw do Power BI.
Gdzie mogę ćwiczyć DAX?
W kursie Power BI w Coddy: każda lekcja daje ci obszar roboczy Power BI w przeglądarce i sprawdza twoją miarę na danych lekcji oraz na ich ukrytych kopiach.