Değişkenler
YoY % =
VAR BuYil = [Net Satış]
VAR GecenYil = CALCULATE([Net Satış], SAMEPERIODLASTYEAR(Tarih[Tarih]))
RETURN
DIVIDE(BuYil - GecenYil, GecenYil)
- Okunurluk: Her ara adımın bir adı olur.
- Performans: Değişken bir kez hesaplanır; formülde iki kez kullansan da tekrar hesaplanmaz.
- Hata ayıklama:
RETURN GecenYilyazıp ara sonucu görebilirsin. - Dikkat: Değişken, tanımlandığı yerdeki bağlamda hesaplanır ve sabit kalır.
CALCULATE(BuYil, ...)yazmak BuYil'i değiştirmez.
IF
Hedef Durumu = IF([Net Satış] >= [Hedef], "Hedefte", "Altında")
SWITCH ve SWITCH(TRUE())
Kanal Kodu = SWITCH(SELECTEDVALUE(Satislar[Kanal]), "Web", "W", "Mobil", "M", "Mağaza", "S", "?")
Performans =
VAR Oran = DIVIDE([Net Satış], [Hedef])
RETURN SWITCH(TRUE(),
ISBLANK(Oran), "Hedef yok",
Oran >= 1.05, "Üstün",
Oran >= 0.95, "Hedefte",
"Geride")
SWITCH(TRUE(), …) iç içe IF'lerin okunur hâlidir: koşullar sırayla denenir, ilk doğru olanın sonucu döner.
SELECTEDVALUE ile dinamik başlık
Başlık = "Net satış · " & SELECTEDVALUE(Tarih[Yil], "Tüm yıllar")
Tek bir yıl seçiliyse o yılı, değilse “Tüm yıllar” metnini döndürür. Görselin başlığına fx düğmesiyle bu ölçüyü bağlayabilirsin.
Değişken bir tablo da olabilir
Sadık Müşteri Satışı =
VAR Sadiklar =
FILTER(VALUES(Satislar[MusteriNo]), CALCULATE([Sipariş Sayısı]) >= 5)
RETURN
CALCULATE([Net Satış], Sadiklar)
Sadiklar bir tablo değişkenidir: en az 5 siparişi olan müşterilerin listesi. CALCULATE’e filtre olarak verilince net satış yalnızca bu müşteriler için hesaplanır. Aynı tabloyu iki yerde kullansan da bir kez hesaplanır.
IF, SWITCH ve BLANK
IF(koşul, değer) yazıp üçüncü bağımsız değişkeni vermezsen, koşul yanlış olduğunda sonuç BLANK olur ve görsel o satırı gizler. Bu, “yalnızca hedefi aşanları göster” gibi ölçüler için bilinçli bir tekniktir. BLANK’in diğer davranışları için BLANK ve hata ayıklama dersine bak.
BuYil, GecenYil, _oran gibi kısa ve anlamlı adlar kullan; tablo değişkenlerine çoğul ad vermek (Sadiklar) okunurluğu artırır.VAR, tanımlandığı yerde ve bir kez hesaplanır
Mülakatlarda en sık sorulan DAX tuzaklarından biri:
Web Satışı (hatalı) = VAR S = [Net Satış] RETURN CALCULATE(S, Satislar[Kanal] = "Web")
Bu ölçü 1.250.772 ₺ döndürür, yani tüm kanalların satışını. Beklenen ise 457.331 ₺. Sebep: S değişkeni tanımlandığı satırda, o anki filtre bağlamında hesaplanır ve bir sabite dönüşür. CALCULATE’in değiştirdiği filtre, artık hesaplanmış bir sayıyı etkilemez. Doğrusu, ölçüyü CALCULATE’in içinde çağırmaktır:
Web Satışı = CALCULATE([Net Satış], Satislar[Kanal] = "Web")
Değişkenlerin bu davranışı aynı zamanda avantajdır: bir değeri dış bağlamda bir kez hesaplayıp sonra farklı bir bağlamda karşılaştırmak için kullanılır, ör. “ürünün satışı, kategorinin ortalamasından büyük mü?”.
VAR T = FILTER(...) bir kez hesaplanır. T’yi CALCULATE’e filtre olarak verebilirsin, ama T’nin içeriği CALCULATE’in değiştirdiği bağlama göre yeniden hesaplanmaz.VAR ile hata ayıklama: ölçüyü parça parça aç
Satış direktörü “Hedef etiketi bazı aylarda saçma” diyor. Ölçü tek satırlık uzun bir formülse nereden başlayacağını bilemezsin. Değişkenlerle yazılmış bir ölçüde ise her ara adımı tek tek görebilirsin. Yöntem basit: RETURN’den sonra sonucu değil, şüphelendiğin değişkeni yaz.
Hedef Etiketi =
VAR Satis = [Net Satış]
VAR Hedef = [Hedef]
VAR Oran = DIVIDE(Satis, Hedef)
RETURN
-- geçici: RETURN Oran
SWITCH(TRUE(), ISBLANK(Oran), "Hedef yok", Oran >= 1, "Hedefte", "Geride")
Ara değerleri tek tek açmak yerine hepsini aynı anda görmek istersen DAX sorgu görünümünü (DAX query view) kullan. Değişkenleri sorgu sütunu yapınca her ayın ara adımlarını yan yana görürsün:
DEFINE
MEASURE Satislar[Tanı Oranı] = DIVIDE([Net Satış], [Hedef])
EVALUATE
SUMMARIZECOLUMNS(
Tarih[YilAy],
"Satış", [Net Satış],
"Hedef", [Hedef],
"Oran", [Tanı Oranı]
)
Bu yöntem bir ekip alışkanlığıdır. Ölçüyü değiştirmeden önce sorgu sekmesinde çalıştır, sonuçları kaydet; değişiklikten sonra aynı sorguyu yeniden çalıştırıp karşılaştır. Böylece “düzelttim ama başka bir yeri bozdum” durumunu yakalarsın.
SWITCH(TRUE()) sırası: ilk doğru kazanır
SWITCH(TRUE(), …) koşulları yukarıdan aşağıya dener ve ilk doğru olanın sonucunu döndürür. Eşikleri yanlış sırada yazmak sessiz bir hatadır; formül çalışır, ama bazı etiketler hiç görünmez.
Etiket (yanlış sıra) = VAR Oran = DIVIDE([Net Satış], [Hedef]) RETURN SWITCH(TRUE(), Oran >= 0.95, "Hedefte", Oran >= 1.05, "Üstün", "Geride") Etiket (doğru sıra) = VAR Oran = DIVIDE([Net Satış], [Hedef]) RETURN SWITCH(TRUE(), Oran >= 1.05, "Üstün", Oran >= 0.95, "Hedefte", "Geride")
36 aylık bir tabloda yanlış sıralı ölçü hiçbir aya “Üstün” demez: 21 “Hedefte”, 15 “Geride”. Doğru sıralı ölçü iki ayı “Üstün” olarak işaretler: Haziran 2023 ve Aralık 2024 (oran %106,3). Yanlış sırada %106’lık bir ay önce “≥ 0,95” koşuluna takılır ve “Hedefte” olur.
VAR UstEsik = 1.05), böylece değiştirmen gerektiğinde tek yeri düzeltirsin.BLANK’i unutmanın iki bedeli
ISBLANK(Oran) kontrolünü atlarsan iki şey olur. Birincisi, satışı olmayan bir kırılımda Oran BLANK’tir; BLANK karşılaştırmalarda 0 gibi davranır ve satır “Geride” etiketi alır. Bu bir hedef başarısızlığı değil, veri yokluğudur. İkincisi, ölçü hiçbir zaman BLANK döndürmediği için görsel, satışı olmayan ürün ve müşterileri de listeler; tablo gereksiz satırlarla dolar.
Sınıflandırmayı saymak
Bir sonraki soru genellikle “Kaç tanesi?” olur: “Bu yıl kaç kategori hedefini tuttu?” Etiketi bir değişkende ya da FILTER koşulunda hesaplayıp satırları sayarsın:
Hedefi Aşan Kategori =
COUNTROWS(
FILTER(VALUES(Kategoriler[Kategori]), [Net Satış] >= [Hedef])
)
2023’te 3 kategori, 2024’te 1 kategori hedefini tuttu; 2022’de hiçbiri (sonuç BLANK). Aylık bakınca Kasım ve Aralık 2024’te 5 kategori hedefte. Tüm dönem satırında sonuç yine BLANK, çünkü hiçbir kategori üç yılın toplam hedefini tutturamadı. Bu, toplam satırının satırların toplamı olmadığının bir örneği daha (Filtre bağlamı dersindeki kural).
FILTER’ın içinde de değişken kullanabilirsin. Değişken, FILTER’ın her satırında o satırın bağlamında yeniden hesaplanır, çünkü tanımlandığı yer satır ifadesinin içidir:
Hedefe Yakın Kategori =
COUNTROWS(
FILTER(
VALUES(Kategoriler[Kategori]),
VAR Oran = DIVIDE([Net Satış], [Hedef])
RETURN Oran >= 0.95 && Oran < 1
)
)