Menu
CoddyTech

Ściąga Power BI

Ostatnia aktualizacja

Darmowy kurs Power BI

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 robiDAX
Utworzenie miaryTotal Sales = SUM ( Sales[Amount] )
Utworzenie kolumny obliczeniowej (jedna wartość na wiersz)Line Total = Sales[Quantity] * Sales[Unit Price]
Utworzenie tabeli obliczeniowejTop Customers = TOPN ( 10, Customer, [Total Sales] )
Odwołanie do kolumny: nazwa tabeli, potem kolumna w nawiasach kwadratowychSales[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 mierzeAverage Price = DIVIDE ( [Total Sales], [Total Units] )

Funkcje agregujące

Każda z nich podsumowuje kolumnę w bieżącym kontekście filtru.

Co robiDAX
Suma kolumnySUM ( Sales[Amount] )
Średnia kolumnyAVERAGE ( Sales[Amount] )
Najmniejsza wartośćMIN ( Sales[Order Date] )
Największa wartośćMAX ( Sales[Order Date] )
Liczba wierszy tabeliCOUNTROWS ( Sales )
Liczba niepustych wartości kolumnyCOUNT ( Sales[Amount] )
Liczba unikatowych wartościDISTINCTCOUNT ( Sales[Customer Key] )
Bezpieczne dzielenie: pusta wartość zamiast błędu, gdy mianownik to 0DIVIDE ( [Total Sales], [Total Units] )
Dzielenie z wartością pokazywaną, gdy mianownik to 0DIVIDE ( [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 robiDAX
Mnożenie w każdym wierszu, potem sumaSUMX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Średnia z wyniku obliczonego dla każdego wierszaAVERAGEX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Największy wynik obliczony dla wierszaMAXX ( Sales, Sales[Quantity] * Sales[Unit Price] )
Średnia miary na klientaAVERAGEX ( VALUES ( Customer[Customer Key] ), [Total Sales] )
Kolumna z powiązanej tabeli w wyrażeniuSUMX ( Sales, Sales[Quantity] * RELATED ( Product[Unit Cost] ) )
Liczba wierszy spełniających warunekCOUNTROWS ( FILTER ( Sales, Sales[Quantity] >= 3 ) )
Ranking każdego produktu według miaryRANKX ( 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 tekstCONCATENATEX ( 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 robiDAX
Filtr na jedną wartośćCALCULATE ( [Total Sales], Product[Category] = "Bikes" )
Filtr na listę wartościCALCULATE ( [Total Sales], Product[Color] IN { "Red", "Blue" } )
Dwa filtry (AND)CALCULATE ( [Total Sales], Product[Color] = "Red", Store[Country] = "Spain" )
OR na dwóch kolumnachCALCULATE ( [Total Sales], FILTER ( ALL ( Product[Color], Product[Brand] ), Product[Color] = "Red" || Product[Brand] = "Contoso" ) )
Filtr według miaryCALCULATE ( [Total Sales], FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Zachowanie istniejącego filtru i część wspólna z nimCALCULATE ( [Total Sales], KEEPFILTERS ( Product[Color] IN { "Red", "Blue" } ) )
Usunięcie filtrów z kolumnyCALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) )
Usunięcie wszystkich filtrów z tabeliCALCULATE ( [Total Sales], ALL ( Product ) )
Usunięcie wszystkich filtrów z tabeli oprócz wybranych kolumnCALCULATE ( [Total Sales], ALLEXCEPT ( Store, Store[Country] ) )
Zachowanie wyboru we fragmentatorach bez wierszy samej wizualizacjiCALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) )
Użycie nieaktywnej relacjiCALCULATE ( [Total Sales], USERELATIONSHIP ( Sales[Ship Date], 'Date'[Date] ) )
Filtr płynący w obie strony dla jednej miaryCALCULATE ( COUNTROWS ( Customer ), CROSSFILTER ( Sales[Customer Key], Customer[Customer Key], BOTH ) )
Filtr według tabeli bez relacjiCALCULATE ( [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 robiDAX
Od początku rokuTOTALYTD ( [Total Sales], 'Date'[Date] )
Od początku roku, rok obrachunkowy kończy się 30 czerwcaTOTALYTD ( [Total Sales], 'Date'[Date], "6/30" )
Od początku roku wewnątrz CALCULATECALCULATE ( [Total Sales], DATESYTD ( 'Date'[Date] ) )
Od początku kwartałuTOTALQTD ( [Total Sales], 'Date'[Date] )
Od początku miesiącaTOTALMTD ( [Total Sales], 'Date'[Date] )
Ten sam okres w poprzednim rokuCALCULATE ( [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ącCALCULATE ( [Total Sales], PREVIOUSMONTH ( 'Date'[Date] ) )
Cały okres sprzed rokuCALCULATE ( [Total Sales], PARALLELPERIOD ( 'Date'[Date], -1, YEAR ) )
Ostatnie 12 miesięcy do ostatniej widocznej datyCALCULATE ( [Total Sales], DATESINPERIOD ( 'Date'[Date], MAX ( 'Date'[Date] ), -12, MONTH ) )
Stały zakres datCALCULATE ( [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 robiDAX
Procent wszystkich kategoriiCategory % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], REMOVEFILTERS ( Product[Category] ) ) )
Procent tego, co zostawiają fragmentatoryVisible % = DIVIDE ( [Total Sales], CALCULATE ( [Total Sales], ALLSELECTED ( Product[Category] ) ) )
Wzrost rok do rokuYoY % = VAR LastYear = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN DIVIDE ( [Total Sales] - LastYear, LastYear )
Suma narastająca przez cały okresRunning 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ątkiTop 5 Sales = IF ( RANKX ( ALLSELECTED ( Product[Product] ), [Total Sales] ) <= 5, [Total Sales] )
Liczba klientów powyżej proguBig Customers = COUNTROWS ( FILTER ( VALUES ( Customer[Customer Key] ), [Total Sales] > 1000 ) )
Suma, która zgadza się z sumą wierszyBonus Total = SUMX ( VALUES ( Product[Category] ), [Bonus] )
Wartość tylko na jednym poziomie macierzyCategory 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 robiDAX
Jeden warunekIF ( [Total Sales] > 1000, "High", "Low" )
Kilka wartości jednego wyrażeniaSWITCH ( Store[Country], "Spain", "ES", "Portugal", "PT", "Other" )
Przedziały sprawdzane od góry do dołuSWITCH ( TRUE (), [Total Sales] >= 10000, "A", [Total Sales] >= 1000, "B", "C" )
AND i ORIF ( 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ślnaSELECTEDVALUE ( Product[Category], "All categories" )
Czy ten wiersz wizualizacji jest grupowany według kolumny?ISINSCOPE ( Product[Category] )
Zwrócenie pustej wartościBLANK ()

Funkcje tekstowe

Operator & łączy tekst; FORMAT zamienia liczbę lub datę na tekst.

Co robiDAX
Łączenie tekstuCustomer[First Name] & " " & Customer[Last Name]
Formatowanie liczbyFORMAT ( [Total Sales], "#,0.00" )
Formatowanie datyFORMAT ( 'Date'[Date], "mmm yyyy" )
Pierwsze znakiLEFT ( Product[Code], 3 )
Znaki od podanej pozycjiMID ( Product[Code], 4, 2 )
DługośćLEN ( Product[Name] )
Wielkie literyUPPER ( Store[City] )
Usunięcie zbędnych spacjiTRIM ( Customer[Name] )
Zamiana tekstuSUBSTITUTE ( 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 robiDAX
Dzisiejsza dataTODAY ()
Utworzenie datyDATE ( 2025, 12, 31 )
Rok z datyYEAR ( 'Date'[Date] )
Numer miesiącaMONTH ( 'Date'[Date] )
Dzień tygodnia, poniedziałek jako 1WEEKDAY ( 'Date'[Date], 2 )
Numer tygodnia, tygodnie od poniedziałkuWEEKNUM ( 'Date'[Date], 2 )
Ostatni dzień miesiącaEOMONTH ( 'Date'[Date], 0 )
Ten sam dzień miesiąc wcześniejEDATE ( 'Date'[Date], -1 )
Liczba dni między dwiema datamiDATEDIFF ( Sales[Order Date], Sales[Ship Date], DAY )
Tabela dat ze stałych datCALENDAR ( DATE ( 2024, 1, 1 ), DATE ( 2025, 12, 31 ) )
Tabela dat z dat w modeluCALENDARAUTO ()

Relacje i wyszukiwanie

RELATED idzie wzdłuż relacji od strony wiele do strony jeden.

Co robiDAX
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 relacjiLOOKUPVALUE ( 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 wierszaUSERPRINCIPALNAME ()

Funkcje tabelaryczne

Zwracają tabele: używaj ich w tabeli obliczeniowej, wewnątrz CALCULATE albo w iteratorze.

Co robiDAX
Unikatowe wartości w bieżącym filtrzeVALUES ( Product[Category] )
Wiersze spełniające warunekFILTER ( Product, Product[Price] > 100 )
N pierwszych wierszy według miaryTOPN ( 5, ALL ( Product[Product] ), [Total Sales] )
Grupowanie według kolumn i dodanie miarSUMMARIZECOLUMNS ( Product[Category], "Sales", [Total Sales] )
Dodanie kolumny do tabeliADDCOLUMNS ( VALUES ( Product[Category] ), "Sales", [Total Sales] )
Wybór kolumn i zmiana ich nazwSELECTCOLUMNS ( Customer, "Name", Customer[Name], "City", Customer[City] )
Lista liczbGENERATESERIES ( 1, 10, 1 )
Wszystkie kombinacje dwóch tabelCROSSJOIN ( VALUES ( 'Date'[Year] ), VALUES ( Product[Category] ) )
Złożenie jedna pod drugą dwóch tabel o tych samych kolumnachUNION ( 'Sales 2024', 'Sales 2025' )

Zmienne

VAR nadaje nazwę krokowi i oblicza go raz; RETURN zwraca wynik.

Co robiDAX
Jedna zmiennaMargin % = VAR Revenue = [Total Sales] RETURN DIVIDE ( Revenue - [Total Cost], Revenue )
Kilka zmiennychSales vs LY = VAR CY = [Total Sales] VAR PY = CALCULATE ( [Total Sales], SAMEPERIODLASTYEAR ( 'Date'[Date] ) ) RETURN CY - PY
Tabela w zmiennejTop 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 robiM
Zachowanie pasujących wierszyTable.SelectRows(Source, each [Status] = "Paid")
Usunięcie kolumnTable.RemoveColumns(Source, {"Notes", "Temp"})
Ustawienie typów kolumnTable.TransformColumnTypes(Source, {{"Amount", type number}, {"Date", type date}})
Zmiana nazwy kolumnyTable.RenameColumns(Source, {{"amt", "Amount"}})
Dodanie kolumnyTable.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 agregacjaTable.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?
Tak. Funkcje takie jak 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.

Ilustracja języków programowania w Coddy

Naucz się języka Power BI z Coddy

Zacznij