Data Analytics & BI serimizin bir parçası
Tam kılavuzu okuyunHer İşletme Kullanıcısının Bilmesi Gereken DAX Formülleri
DAX (Veri Analizi İfadeleri), Power BI'ı basit bir grafik aracından tam teşekküllü bir analitik motora dönüştüren formül dilidir. Power BI'ın sürükle ve bırak arayüzü temel toplamaları yönetirken, gerçek iş zekası DAX'ı gerektirir. Yıldan yıla karşılaştırmalar, yuvarlanan ortalamalar, sıralamalar, olası senaryolar ve karmaşık KPI'ların tümü DAX formüllerine bağlıdır.
Buradaki zorluk, DAX'in aldatıcı derecede basit görünmesine rağmen deneyimli Excel kullanıcılarını bile şaşırtacak şekilde davranmasıdır. Filtre bağlamı, satır bağlamı ve bağlam geçişi kavramları DAX'a özgüdür ve Excel veya SQL'de doğrudan eşdeğeri yoktur. Bu kılavuz, anında uyarlayabileceğiniz gerçek dünyadan örneklerle, iş kullanıcıları için en pratik 20 DAX formülüne odaklanmaktadır.
Temel Çıkarımlar
- HESAPLAMA en önemli tek DAX işlevidir --- filtre bağlamını değiştirir ve önemsiz olmayan ölçümlerin yüzde 80'inden fazlasında kullanılır
- Zaman zekası işlevleri (TOTALYTD, SAMEPERIODLASTYEAR, DATEADD), modelde bu şekilde işaretlenmiş uygun bir tarih tablosu gerektirir
- VAR/RETURN sözdizimi karmaşık ölçümleri okunabilir hale getirir ve gereksiz hesaplamaları önler
- Yineleyici işlevler (SUMX, AVERAGEX, RANKX) ifadeleri satır satır değerlendirirken toplayıcılar (SUM, AVERAGE) sütunlar üzerinde çalışır
- Bağlam geçişi, hesaplanan bir sütun veya yineleyici bir ölçü çağırdığında satır bağlamını filtre bağlamına dönüştürdüğünde meydana gelir
- SWITCH(TRUE(), ...), iç içe geçmiş IF ifadelerinin yerine geçer ve çok daha okunabilirdir
- ALL, ALLEXCEPT ve REMOVEFILTERS hangi filtrelerin etkin olduğunu kontrol eder - ancak RLS etkilerine karşı dikkatli olun
Temel: Filtre İçeriği ve Satır İçeriği
Formüllere dalmadan önce bu iki kavramı anlamak çok önemlidir. DAX'taki her karışıklığın kökeni filtre bağlamı ve satır bağlamına kadar uzanır.
Filtre İçeriği
Filtre bağlamı, bir hesaplamaya uygulanan filtreler kümesidir. Dilimleyicilerden, görsel filtrelerden, sayfa filtrelerinden, rapor filtrelerinden ve RLS'den gelir. Satırlarında "Yıl" ve sütunlarında "Bölge" bulunan bir matris görseline bir hesaplama yerleştirdiğinizde, her hücrenin benzersiz bir filtre bağlamı olur: (Yıl = 2025, Bölge = Kuzey Amerika), (Yıl = 2025, Bölge = EMEA) vb.
Her DAX toplama işlevi (SUM, AVERAGE, COUNT, MIN, MAX) geçerli filtre bağlamı içinde değerlendirme yapar. 2025 + Kuzey Amerika'ya göre filtrelenmiş bir hücredeki SUM(Sales[Revenue]) yalnızca her iki koşulla eşleşen gelir satırlarını toplar.
Satır İçeriği
Satır bağlamı, hesaplanan sütunların ve yineleyici işlevlerin içinde bulunur. "Geçerli satır" anlamına gelir. Satış tablosundaki hesaplanan bir sütunda, Sales[Revenue] * Sales[Quantity] her satırı ayrı ayrı değerlendirir.
Bağlam Geçişi
Bir yineleyici işlevi (SUMX gibi) bir ölçü çağırdığında, satır bağlamı otomatik olarak filtre bağlamına dönüştürülür. Buna bağlam geçişi denir. Güçlüdür ancak yanlış kullanıldığında performans sorunlarına neden olabilir.
-- Row context exists here (iterating over Products)
Revenue Per Product =
SUMX(
Products,
[Total Revenue] -- This measure is evaluated in filter context
-- where the current product's ID filters the Sales table
)
Bu kavramları anlamak her DAX formülünü sezgisel hale getirir. Bunlar olmadan DAX formülleri kara kutular gibi görünür.
20 Temel Formül
1. HESAPLAMA — Filtre Bağlamını Değiştirin
HESAPLAMA en önemli DAX işlevidir. Bir ifadeyi değiştirilmiş bir filtre bağlamında değerlendirir.
Sözdizimi: CALCULATE(expression, filter1, filter2, ...)
Örnek: Yalnızca büyük siparişlerden elde edilen gelir
Large Order Revenue =
CALCULATE(
SUM(Sales[Revenue]),
Sales[OrderTotal] > 10000
)
Örnek: Belirli bir ürün kategorisinden elde edilen gelir
Electronics Revenue =
CALCULATE(
SUM(Sales[Revenue]),
Products[Category] = "Electronics"
)
HESAPLA, belirtilen sütundaki mevcut filtrenin yerini alır. Bir dilimleyici Kategoriyi zaten "Giyim" olarak filtreliyorsa Elektronik Gelir ölçümü bu dilimleyiciyi yok sayar ve CALCULATE kategori filtresini geçersiz kıldığından Elektronik gelirini gösterir.
2. FİLTRE — Satır Düzeyinde Filtreleme
FILTER, bir koşula göre filtrelenmiş bir tablo döndürür. Basit bir sütun karşılaştırması olarak ifade edilemeyen karmaşık filtreleme için genellikle CALCULATE içinde kullanılır.
Sözdizimi: FILTER(table, condition)
Örnek: 5'ten fazla siparişi olan müşterilerden elde edilen gelir
Revenue From Repeat Customers =
CALCULATE(
SUM(Sales[Revenue]),
FILTER(
Customers,
CALCULATE(COUNTROWS(Sales)) > 5
)
)
Önemli: FILTER satır satır yinelenir, bu da onu büyük tablolardaki basit CALCULATE filtrelerinden daha yavaş hale getirir. Yalnızca doğrudan sütun filtresi yetersiz olduğunda kullanın.
3. HEPSİ — Tüm Filtreleri Kaldır
ALL, bir tablo veya sütundaki tüm filtreleri kaldırır ve filtrelenmemiş tablonun tamamını döndürür. Toplamları, toplam yüzdelerini ve oranları hesaplamak için kullanılır.
Sözdizimi: ALL(table) veya ALL(table[column])
Örnek: Toplamın yüzdesi olarak gelir
Revenue % of Total =
DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(SUM(Sales[Revenue]), ALL(Sales))
)
Bir dilimleyici "Kuzey Amerika"ya filtre uyguladığında SUM(Sales[Revenue]) Kuzey Amerika'nın gelirini döndürür. CALCULATE(SUM(Sales[Revenue]), ALL(Sales)) tüm filtreleri kaldırır ve küresel geliri döndürür. Bölme yüzdeyi verir.
4. ALLEXCEPT — Belirtilenler Dışındaki Tüm Filtreleri Kaldır
ALLEXCEPT, belirtilen sütunlar dışındaki tüm filtreleri tablodan kaldırır. Bu, bazı filtreleri (yıl gibi) korurken diğerlerini (ürün kategorisi gibi) kaldırmak istediğinizde kullanışlıdır.
Sözdizimi: ALLEXCEPT(table, column1, column2, ...)
Örnek: Cari yıl içindeki gelir paylaşımı
Revenue % of Year Total =
DIVIDE(
SUM(Sales[Revenue]),
CALCULATE(
SUM(Sales[Revenue]),
ALLEXCEPT(Sales, DateTable[Year])
)
)
Bu, her ürünün veya bölgenin tüm zamanlar için değil, seçilen yıl içindeki gelir payını gösterir.
5. TOTALYTD — Yılbaşından Bugüne
TOTALYTD, bağlam içinde yılın başlangıcından geçerli tarihe kadar devam eden bir toplamı hesaplar.
Sözdizimi: TOTALYTD(expression, dates[date_column], [filter], [year_end_date])
Örnek: Yılbaşından bugüne gelir
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])
30 Haziran'da sona eren mali yıl için:
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "6/30")
Önkoşul: DateTable'ın modelde bir tarih tablosu olarak işaretlenmesi gerekir (Tablo Araçları, ardından Tarih Tablosu Olarak İşaretle).
6. GEÇEN YILIN AYNI DÖNEMİ — yıldan yıla
SAMEPERIODLASTYEAR, tarih bağlamını tam olarak bir yıl geriye kaydırır.
Sözdizimi: SAMEPERIODLASTYEAR(dates[date_column])
Örnek: Geçen yıla göre gelir
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), SAMEPERIODLASTYEAR(DateTable[Date]))
Revenue YoY Growth =
VAR CurrentRevenue = SUM(Sales[Revenue])
VAR PriorRevenue = [Revenue PY]
RETURN
DIVIDE(CurrentRevenue - PriorRevenue, PriorRevenue, 0)
Aylık bir matriste, her satır büyüme yüzdesiyle birlikte cari ayın ve önceki yılın aynı ayının gelirini gösterir.
7. DATEADD — Esnek Zaman Kaymaları
DATEADD, tarihleri herhangi bir aralığa göre kaydırır: gün, ay, çeyrek veya yıl. SAMEPERIODLASTYEAR'dan daha esnektir.
Sözdizimi: DATEADD(dates[date_column], intervals, interval_type)
Örnek: 3 ay önceki gelir
Revenue 3 Months Ago =
CALCULATE(
SUM(Sales[Revenue]),
DATEADD(DateTable[Date], -3, MONTH)
)
Örnek: 12 aylık gelirin yuvarlanması
Revenue Rolling 12M =
CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)
8. RANKX — Dinamik Sıralamalar
RANKX, bir ifadeye dayalı olarak her öğeye bir sıralama atar.
Sözdizimi: RANKX(table, expression, [value], [order], [ties])
Örnek: Ürünleri gelire göre sıralayın
Product Revenue Rank =
RANKX(
ALL(Products[ProductName]),
[Total Revenue],
,
DESC,
DENSE
)
ALL(Ürünler[ÜrünAdı]), ürünlerdeki dilimleyici filtrelerine bakılmaksızın, sıralanacak ürünlerin tam listesini sağlar. DESC, en yüksek gelirin 1. sırayı alacağı anlamına gelir. DENSE, bağlı değerlerin aynı sırayı alacağı anlamına gelir.
Örnek: Üst N filtresi
Top 10 Products Revenue =
CALCULATE(
[Total Revenue],
FILTER(
ALL(Products[ProductName]),
RANKX(ALL(Products[ProductName]), [Total Revenue], , DESC) <= 10
)
)
9. ANAHTAR — Koşullu Mantık
SWITCH, iç içe geçmiş IF ifadelerinin yerini alır ve çok daha okunabilirdir.
Sözdizimi: SWITCH(expression, value1, result1, value2, result2, ..., else_result)
Örnek: Müşteri segmenti sınıflandırması
Customer Segment =
SWITCH(
TRUE(),
[Total Revenue] > 100000, "Enterprise",
[Total Revenue] > 25000, "Mid-Market",
[Total Revenue] > 5000, "SMB",
"Startup"
)
Örnek: Dinamik ölçü seçimi
Selected Measure =
SWITCH(
SELECTEDVALUE(MeasureSelector[Measure]),
"Revenue", [Total Revenue],
"Orders", [Order Count],
"AOV", [Average Order Value],
"Margin", [Gross Margin %],
[Total Revenue]
)
Bu model, kullanıcıların bir grafikte hangi ölçümün görüntüleneceğini seçmesine olanak tanıyan bir dilimleyiciyle çalışır.
10. VAR / DÖNÜŞ — Değişkenler
Değişkenler ara sonuçları saklayarak formülleri okunabilir hale getirir ve gereksiz hesaplamaları önler. Bir değişken bir kez değerlendirilir ve yeniden kullanılır.
Sözdizimi: VAR name = expression RETURN final_expression
Örnek: Değişkenli karmaşık KPI
Customer Health Score =
VAR Revenue = [Total Revenue]
VAR OrderCount = [Order Count]
VAR DaysSinceLastOrder =
DATEDIFF(MAX(Sales[OrderDate]), TODAY(), DAY)
VAR RevenueScore =
SWITCH(TRUE(), Revenue > 50000, 3, Revenue > 10000, 2, 1)
VAR FrequencyScore =
SWITCH(TRUE(), OrderCount > 20, 3, OrderCount > 5, 2, 1)
VAR RecencyScore =
SWITCH(TRUE(), DaysSinceLastOrder < 30, 3, DaysSinceLastOrder < 90, 2, 1)
RETURN
RevenueScore + FrequencyScore + RecencyScore
Değişkenler olmadan, bu formül aynı hesaplamaları birden çok kez tekrarlayarak onu okunamaz hale getirir ve daha yavaş hale getirir.
11. BÖL — Güvenli Bölme
DIVIDE, sıfıra bölme işlemini sorunsuz bir şekilde gerçekleştirir ve hata yerine belirli bir alternatif sonuç döndürür.
Sözdizimi: DIVIDE(numerator, denominator, [alternate_result])
Örnek:
Conversion Rate =
DIVIDE([Closed Won Deals], [Total Opportunities], 0)
Ölçülerde her zaman / operatörü yerine DIVIDE kullanın. / operatörü sıfıra bölerken hata döndürerek görsellerinizi bozar.
12. DISTINTCCOUNT — Benzersiz Değerleri Say
DISTINTCCOUNT bir sütundaki benzersiz değerlerin sayısını sayar.
Sözdizimi: DISTINCTCOUNT(column)
Örnek: Dönem içindeki aktif müşteriler
Active Customers =
DISTINCTCOUNT(Sales[CustomerID])
Bu, geçerli filtre bağlamında (seçili ay, üç aylık dönem vb.) en az bir satın alma işlemi gerçekleştiren tekil müşterileri sayar.
13. ÜLKELER — Tablodaki Satırları Sayma
COUNTROWS, isteğe bağlı olarak filtrelenen bir tablodaki satır sayısını sayar.
Sözdizimi: COUNTROWS(table)
Örnek: Sipariş sayısı
Order Count =
COUNTROWS(Sales)
Cancelled Orders =
CALCULATE(
COUNTROWS(Sales),
Sales[Status] = "Cancelled"
)
14. SUMX — Satır Satır Toplamı
SUMX, her satır için bir ifadeyi değerlendiren ve sonuçları toplayan bir yineleyicidir. Toplamadan önce sütunları çarpmanız gerektiğinde bu çok önemlidir.
Sözdizimi: SUMX(table, expression)
Örnek: Ağırlıklı ortalama hesaplama
Weighted Average Price =
DIVIDE(
SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]),
SUM(Sales[Quantity])
)
SUM iki sütunu çarpamaz. Her satır için Miktar çarpı BirimFiyat değerini değerlendirmek ve ardından sonuçları toplamak için SUMX'e ihtiyacınız vardır.
15. AVERAGEX — Satır Satır Ortalaması
AVERAGEX, AVERAGE'ın yineleyici versiyonudur.
Sözdizimi: AVERAGEX(table, expression)
Örnek: Ortalama kapanış gün sayısı
Average Days to Close =
AVERAGEX(
Opportunities,
DATEDIFF(Opportunities[CreatedDate], Opportunities[ClosedDate], DAY)
)
16. MAXX ve MINX — Yineleyici Min/Maks
MAXX ve MINX, satır satır değerlendirilen bir ifadenin maksimum veya minimum değerini bulur.
Örnek: Müşteri başına en son sipariş tarihi
Most Recent Order =
MAXX(Sales, Sales[OrderDate])
Oldest Unpaid Invoice =
MINX(
FILTER(Invoices, Invoices[PaymentStatus] = "Unpaid"),
Invoices[InvoiceDate]
)
17. ARAMA DEĞERİ — DÜŞEYARA Eşdeğeri
LOOKUPVALUE, bir veya daha fazla arama kriterine göre tablodan bir değer alır. Excel'in DÜŞEYARA fonksiyonunun DAX eşdeğeridir.
Sözdizimi: LOOKUPVALUE(result_column, search_column, search_value, ...)
Örnek:
Customer Region =
LOOKUPVALUE(
Customers[Region],
Customers[CustomerID], Sales[CustomerID]
)
Not: LOOKUPVALUE genellikle hesaplamalarda değil, hesaplanan sütunlarda kullanılır. Ölçülerde RELATED (çoka-bir için) veya RELATEDTABLE (birden çoğa için) tercih edilir.
18. SELECTEDVALUE — Geçerli Dilimleyici Değerini Al
SELECTEDVALUE, filtre bağlamında tam olarak bir değer olduğunda bir sütunun değerini döndürür. Birden fazla değer seçilirse alternatif sonucu döndürür.
Sözdizimi: SELECTEDVALUE(column, [alternate_result])
Örnek: Dinamik başlık
Chart Title =
"Revenue for " & SELECTEDVALUE(DateTable[Year], "All Years")
19. ISBLANK — Boş Değerleri Kontrol Edin
ISBLANK, bir değerin boş (boş/boş) olup olmadığını test eder.
Örnek: Atanmış bir satış elemanı olmayan siparişler
Unassigned Orders =
CALCULATE(
COUNTROWS(Sales),
ISBLANK(Sales[SalespersonID])
)
20. CONCATATEX — Tablodaki Değerleri Birleştirin
CONCATENATEX bir tablo üzerinde yinelenir ve değerleri tek bir dizede birleştirir.
Sözdizimi: CONCATENATEX(table, expression, [delimiter], [order_by], [order])
Örnek: Bir müşteri tarafından satın alınan ürünlerin listesi
Products Purchased =
CONCATENATEX(
VALUES(Products[ProductName]),
Products[ProductName],
", ",
Products[ProductName], ASC
)
Müşteri ayrıntıları tablosunda bu, her müşteri için "Ürün A, Ürün B, Ürün C"yi gösterir.
Zaman Zekası Derin İncelemesi
Zaman zekası, iş kullanıcılarının DAX'a ihtiyaç duymasının en yaygın nedenidir. Power BI'ın zaman zekası işlevleri özel bir tarih tablosu gerektirir. İşte kapsamlı bir zaman ölçümleri seti.
Önkoşullar: Tarih Tablosu
Modelinizde aşağıdakileri içeren bir tarih tablosu bulunmalıdır:
- Tüm veri aralığınızı kapsayan sürekli bir tarih sütunu (boşluksuz)
- Tarih tablosu olarak işaretlenen tablo (Tablo Araçları, ardından Tarih Tablosu Olarak İşaretle)
- Tarih tablosunun tarih sütunundan her bir olgu tablosunun tarih sütununa olan ilişki
Ortak Zaman İstihbaratı Önlemleri
-- Month-to-Date
Revenue MTD =
TOTALMTD(SUM(Sales[Revenue]), DateTable[Date])
-- Quarter-to-Date
Revenue QTD =
TOTALQTD(SUM(Sales[Revenue]), DateTable[Date])
-- Year-to-Date
Revenue YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date])
-- Previous Month
Revenue PM =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSMONTH(DateTable[Date]))
-- Previous Quarter
Revenue PQ =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSQUARTER(DateTable[Date]))
-- Previous Year
Revenue PY =
CALCULATE(SUM(Sales[Revenue]), PREVIOUSYEAR(DateTable[Date]))
-- Month-over-Month Growth
Revenue MoM % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PM]
RETURN DIVIDE(Current - Prior, Prior, 0)
-- Year-over-Year Growth
Revenue YoY % =
VAR Current = SUM(Sales[Revenue])
VAR Prior = [Revenue PY]
RETURN DIVIDE(Current - Prior, Prior, 0)
-- Rolling 3-Month Average
Revenue 3M Avg =
AVERAGEX(
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -3, MONTH),
CALCULATE(SUM(Sales[Revenue]))
)
-- Cumulative Total (Running Sum)
Revenue Cumulative =
CALCULATE(
SUM(Sales[Revenue]),
FILTER(
ALL(DateTable[Date]),
DateTable[Date] <= MAX(DateTable[Date])
)
)
Mali Yıl Zaman İstihbaratı
Mali yılınız takvim yılıyla uyumlu değilse isteğe bağlı Year_end_date parametresini kullanın:
-- Fiscal Year ending March 31
Revenue Fiscal YTD =
TOTALYTD(SUM(Sales[Revenue]), DateTable[Date], "3/31")
-- Or use DATESYTD for more control
Revenue Fiscal YTD v2 =
CALCULATE(
SUM(Sales[Revenue]),
DATESYTD(DateTable[Date], "3/31")
)
Bağlam Geçişi: Gizli Motor
Bağlam geçişi, bir ölçü çağrıldığında satır bağlamının (hesaplanmış bir sütundan veya yineleyiciden) filtre bağlamına dönüştürüldüğü süreçtir. Bu DAX'taki en güçlü ve en yanlış anlaşılan kavramdır.
Nasıl Çalışır?
Bu önlemi düşünün:
Total Revenue = SUM(Sales[Revenue])
Ürünler tablosundaki şu hesaplanan sütun:
Product Revenue = [Total Revenue]
Hesaplanan sütunda satır bağlamı (geçerli ürün satırı) bulunur. [Total Revenue] çağrıldığında içerik geçişi satır içeriğini bir filtreye dönüştürür: CALCULATE(SUM(Sales[Revenue]), Products[ProductID] = <current row's ProductID>). Sonuç, söz konusu ürün için gelirdir.
Performans Etkileri
Bağlam geçişi, ölçü çağrısının çevresine örtülü bir HESAPLAMA ekler. Küçük masalar için bu önemsizdir. Karmaşık ölçülere sahip büyük tablolar için pahalı olabilir. Büyük tablolar üzerinden yineleyicilerin içindeki karmaşık önlemleri çağırmaktan kaçının.
Verimsiz:
-- Iterates over every customer, calling a complex measure each time
Customer Profitability =
SUMX(
Customers,
[Revenue] - [COGS] - [Allocated Overhead]
)
Daha iyi:
-- Pre-compute the components and use simple arithmetic
Customer Profitability =
SUM(Sales[Revenue]) - SUM(Sales[COGS]) -
DIVIDE(SUM(Sales[Revenue]), [Total Revenue]) * [Total Overhead]
Pratik İş Senaryoları
Senaryo 1: ABC Analizi (Pareto Sınıflandırması)
Ürünleri A (gelirin en üst %80'i), B (sonraki %15) ve C (en alttaki %5) olarak sınıflandırın:
ABC Class =
VAR CurrentProduct = SELECTEDVALUE(Products[ProductName])
VAR AllProducts =
ADDCOLUMNS(
ALL(Products[ProductName]),
"@Revenue", [Total Revenue]
)
VAR Sorted = TOPN(COUNTROWS(AllProducts), AllProducts, [@Revenue], DESC)
VAR TotalRev = SUMX(AllProducts, [@Revenue])
VAR CumulativeRev =
SUMX(FILTER(Sorted, [@Revenue] >= [Total Revenue]), [@Revenue])
VAR CumulativePct = DIVIDE(CumulativeRev, TotalRev)
RETURN
SWITCH(TRUE(),
CumulativePct <= 0.8, "A",
CumulativePct <= 0.95, "B",
"C"
)
Senaryo 2: Kohortu Elde Tutma Analizi
Her bir satın alma grubundan kaç müşterinin zaman içinde aktif kaldığını takip edin:
Cohort Retention Rate =
VAR CohortMonth = SELECTEDVALUE(DateTable[YearMonth])
VAR CohortCustomers =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
FILTER(
ALL(Sales),
FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
)
)
VAR ActiveCustomers =
CALCULATE(
DISTINCTCOUNT(Sales[CustomerID]),
FILTER(
ALL(Sales),
FORMAT(Sales[FirstPurchaseDate], "YYYY-MM") = CohortMonth
)
)
RETURN
DIVIDE(ActiveCustomers, CohortCustomers, 0)
Senaryo 3: Hareketli Yıllık Toplam (MAT)
Hareketli bir yıllık toplam, son 12 tam ayı toplayarak mevsimselliği düzeltir:
Revenue MAT =
CALCULATE(
SUM(Sales[Revenue]),
DATESINPERIOD(DateTable[Date], MAX(DateTable[Date]), -12, MONTH)
)
Revenue MAT Growth =
VAR Current = [Revenue MAT]
VAR Prior =
CALCULATE(
[Revenue MAT],
DATEADD(DateTable[Date], -12, MONTH)
)
RETURN
DIVIDE(Current - Prior, Prior, 0)
Yineleyici ve Toplayıcı: Her Biri Ne Zaman Kullanılmalı
Toplayıcı İşlevleri
SUM, ORTALAMA, COUNT, MIN, MAX tek bir sütun üzerinde çalışır. Hızlıdırlar çünkü depolama motoru bunları doğrudan sıkıştırılmış sütun verilerinden çözebilir.
Ne zaman kullanın: Bir sütunun basit bir şekilde toplanmasına ihtiyacınız var.
Yineleyici İşlevleri
SUMX, AVERAGEX, COUNTX, MINX, MAXX, RANKX bir ifadeyi satır satır değerlendirir. Daha esnektirler ancak daha yavaştırlar çünkü formül motoru her satırı işler.
Ne zaman kullanın:
- Toplamadan önce sütunları çarpmanız gerekir (ağırlıklı hesaplamalar için SUMX)
- Her satıra bir koşul uygulamanız gerekir (IF ile COUNTX)
- Öğeleri sıralamanız gerekir (RANKX)
- Hesaplama, satır düzeyinde değerlendirme gerektiren ilgili tablolardaki değerlere bağlıdır
Temel performans kuralı: Aynı sonuç bir toplayıcıyla elde edilebiliyorsa toplayıcıyı kullanın. Yineleyicileri yalnızca satır satır değerlendirmenin gerekli olduğu durumlarda kullanın.
DAX'ta hata ayıklama
Yaygın Hata Mesajları
| Hata | Sebep | Düzelt |
|---|---|---|
| "X sütunu için tek bir değer bekleniyor" | Measure, beklendiği yerde birden çok değer döndürür | Bir değere düşürmek için SELECTEDVALUE, MAX veya CALCULATE kullanın |
| "Döngüsel bağımlılık" | Hesaplanan iki sütun veya ölçü birbirine referans verir | Döngüyü kaldırmak için hesaplama zincirini yeniden tasarlayın |
| "İlişkiler belirlenemiyor" | Tablolar arasında belirsiz ilişki yolu | USERELATIONSHIP'te ilişkiyi belirtin veya etkinleştirin |
| "İfade birden çok sütuna başvuruyor" | ALL/VALUES birden çok sütunla yanlış kullanılmış | ALL(Tablo) veya ALL(Tablo[Sütun1], Tablo[Sütun2]) |
Performans Analizörü
Power BI Desktop'ın Performans Analiz Aracı (Görünüm, ardından Performans Analiz Aracı), her görsel için DAX sorgusunu ve yürütme süresini gösterir. Şunları yapmak için kullanın:
- Yavaş görselleri tanımlayın (1 saniyeden fazla)
- Ayrıntılı analiz için DAX sorgusunu DAX Studio'ya kopyalayın
- Ölçüleri optimize ederken yürütme öncesi/sonrası sürelerini karşılaştırın
DAX Stüdyosu
DAX Studio, ayrıntılı sorgu analizi sağlayan ücretsiz bir harici araçtır. Şunu gösterir:
- Depolama motoru sorguları (hızlı, sütun deposu taramaları)
- Formül motoru sorguları (daha yavaş, satır satır değerlendirme)
- Gerçekleştirme boyutları (motorlar arasında karıştırılan veriler)
Bir ölçü çok sayıda formül motoru sorgusu üretiyorsa, muhtemelen çok fazla yineleyici veya karmaşık FILTER ifadesi kullanıyordur. Depolama motoruna daha fazla iş göndermek için yeniden düzenleme yapın.
DAX'i temel bilgilerden gelişmiş optimizasyona kadar kapsayan Power BI eğitimi için ECOSIRE, özel veri kümelerinize ve işle ilgili sorularınıza göre uyarlanmış uygulamalı atölye çalışmaları sunar.
SSS
Ölçü ile hesaplanan sütun arasındaki fark nedir?
Bir ölçü, geçerli filtre bağlamı içinde sorgu zamanında değerlendirilir. Tabloya veri eklemez; dinamik olarak bir değer hesaplar. Hesaplanan bir sütun, veri yenileme zamanında değerlendirilir ve tabloya fiziksel bir sütun ekler. Toplamalara ve dilimleyicilere ve filtrelere göre değişen KPI'lara yönelik ölçümleri kullanın. Satır düzeyindeki sınıflandırmalar veya dilimleyicilerde, filtrelerde veya ilişkilerde kullanılması gereken değerler için hesaplanan sütunları kullanın. Ölçüler model boyutunu büyütmediği için hemen hemen her zaman tercih edilmektedir.
YTD ölçümüm neden yanlış değerler gösteriyor?
Bunun en yaygın nedeni tarih tablonuzun doğru şekilde yapılandırılmamış olmasıdır. Üç şeyi doğrulayın: (1) tarih tablosunda boşluk yoktur --- verilerinizin başlangıcından bugüne kadar olan her tarih dahil edilmelidir, (2) tablo Power BI'da bir tarih tablosu olarak işaretlenmiştir (Tablo Araçları, ardından Tarih Tablosu Olarak İşaretle) ve (3) tarih tablosu ile olgu tablonuz arasındaki ilişki etkindir ve doğru şekilde eşlenmiştir. Ayrıca tarih sütununuzun tam eşleşmeyi engelleyen bir zaman bileşeni içermediğini de kontrol edin.
FILTER yerine CALCULATE'i ne zaman kullanmalıyım?
Filtreyi basit bir sütun karşılaştırması olarak ifade edebildiğinizde HESAPLAMA işlevini kullanın (ör. KOD0). CALCULATE bunu depolama motorunun optimize edebileceği verimli bir filtreye dönüştürür. Birden çok sütuna veya çağrı ölçülerine başvuran karmaşık satır satır koşullara ihtiyaç duyduğunuzda FİLTRE kullanın (örneğin, CALCULATE(COUNTROWS(Sales)) > 5 olan müşterileri filtreleme). FILTER bir yineleyicidir ve daha yavaştır; bu nedenle mümkün olduğunda CALCULATE'in basit sözdizimini tercih edin.
DAX'ta cari toplam veya kümülatif toplamı nasıl oluştururum?
CALCULATE'i geçerli tarihe kadar olan tüm tarihleri içeren bir filtreyle kullanın: Revenue Cumulative = CALCULATE(SUM(Sales[Revenue]), FILTER(ALL(DateTable[Date]), DateTable[Date] <= MAX(DateTable[Date]))). Bu, mevcut tarih filtresini (TÜMÜ) kaldırır ve onu, geçerli bağlamda başlangıçtan maksimum tarihe kadar tüm tarihleri içeren bir filtreyle değiştirir. Aylık bir matriste her satır, o ay boyunca kümülatif toplamı gösterir.
Veri tabanına geri yazmak için DAX'ı kullanabilir miyim?
Hayır. DAX salt okunur bir sorgu dilidir. Görüntülenmek üzere verileri hesaplayabilir, filtreleyebilir ve dönüştürebilir ancak kaynak veritabanına veri ekleyemez, güncelleyemez veya silemez. Geri yazma senaryoları için Power BI'da yerleşik Power Apps kullanın veya Power BI uyarıları tarafından tetiklenen Power Automate akışlarını kullanın. Bazı üçüncü taraf araçlar (Acterys, Writeback Manager), özel görseller aracılığıyla geri yazma yetenekleri ekler.
Yazan
ECOSIRE Research and Development Team
ECOSIRE'da kurumsal düzeyde dijital ürünler geliştiriyor. Odoo entegrasyonları, e-ticaret otomasyonu ve yapay zeka destekli iş çözümleri hakkında içgörüler paylaşıyor.
İlgili Makaleler
Power BI AI Özellikleri: Copilot, AutoML ve Tahmine Dayalı Analitik
Doğal dil raporları için Copilot, tahminler için AutoML, anormallik tespiti ve akıllı anlatımlar dahil olmak üzere Power BI AI özelliklerinde uzmanlaşın. Lisanslama kılavuzu.
Power BI Kontrol Paneli Geliştirmeye İlişkin Tam Kılavuz
KPI tasarımı, görsel en iyi uygulamalar, detaya geçiş sayfaları, yer işaretleri, mobil düzenler ve RLS güvenliği ile etkili Power BI panolarını nasıl oluşturacağınızı öğrenin.
Power BI Veri Modelleme: İş Zekası için Yıldız Şeması Tasarımı
Yıldız şeması tasarımı, olgu ve boyut tabloları, DAX ölçümleri, hesaplama grupları, zaman zekası ve bileşik modeller ile Power BI veri modellemesinde uzmanlaşın.
Data Analytics & BI serisinden daha fazlası
Power BI Kontrol Paneli Geliştirmeye İlişkin Tam Kılavuz
KPI tasarımı, görsel en iyi uygulamalar, detaya geçiş sayfaları, yer işaretleri, mobil düzenler ve RLS güvenliği ile etkili Power BI panolarını nasıl oluşturacağınızı öğrenin.
Power BI Embedded: Uygulamanıza Analitik Ekleme
Power BI analitiğini SaaS uygulamanıza ekleyin. Kimlik doğrulamayı, çok kiracılı RLS'yi, kapasite boyutlandırmayı, JavaScript SDK'sını, özel temaları ve Fabric fiyatlandırmasını kapsar.
Excel'den Power BI'ya Geçiş: Adım Adım Kılavuz
Formül çevirisi, veri modeli oluşturma, Power Query, doğrulama ve hizmetten çıkarma işlemlerini kapsayan Excel'den Power BI'ya geçişe ilişkin eksiksiz kılavuz.
Power BI + Odoo Entegrasyonu İçin Tam Kılavuz
Gelişmiş analizler için Power BI'ı Odoo ERP'ye bağlayın. PostgreSQL doğrudan sorguları, anahtar tablolar, satış/envanter/İK kontrol panelleri ve artımlı yenileme kurulumu.
İşletmelerde Yapay Zeka Yatırım Getirisini Ölçmek: Gerçekten İşe Yarayan Bir Çerçeve
Departmanlar arasında doğrudan tasarrufları, üretkenlik kazanımlarını, gelir etkisini ve stratejik değeri kapsayan yapay zeka yatırım getirisini ölçmek için pratik bir çerçeve.
Finansal Raporlama Kontrol Panelleri Oluşturma: KPI'lar, Tasarım ve ERP Entegrasyonu
Kararları yönlendiren finansal raporlama kontrol panelleri tasarlayın. Hangi KPI'lerin izleneceğini, kontrol paneli tasarım ilkelerini ve ERP entegrasyonunun en iyi uygulamalarını öğrenin.