Ana içeriğe geç
Kesit Power BI
Orta · DAX Kalıpları

VAR / RETURN, IF ve SWITCH

Değişkenlerle okunur ve hızlı formüller; koşullu mantık ve dinamik metinler.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Değişkenler

YoY % =
VAR BuYil = [Net Satış]
VAR GecenYil = CALCULATE([Net Satış], SAMEPERIODLASTYEAR(Tarih[Tarih]))
RETURN
    DIVIDE(BuYil - GecenYil, GecenYil)

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.

İsimlendirmeDeğişken adları boşluk içeremez ve ölçü adlarıyla çakışmamalı. BuYil, GecenYil, _oran gibi kısa ve anlamlı adlar kullan; tablo değişkenlerine çoğul ad vermek (Sadiklar) okunurluğu artırır.
Derinleş

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ü?”.

Tablo değişkenleri de sabittirVAR 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.
Uzmanlaş

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.

Sıralama kuralı1) BLANK kontrolünü en başa koy. 2) Büyükten küçüğe eşiklerde en yüksek eşik önce gelsin. 3) Son bağımsız değişken “hiçbiri” durumudur; bilerek yaz. 4) Eşik sayılarını değişkene al (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
    )
)
Kontrol listesi: koşullu ölçü1) Her değişkenin adı ne hesapladığını söylüyor mu? 2) BLANK durumu ilk koşul mu? 3) Eşikler büyükten küçüğe mi? 4) Ara değerleri DAX sorgu görünümünde bir kez yan yana gördün mü? 5) Etiket ölçüsü, satırı olmayan kırılımlarda BLANK dönüyor mu?
Alıştırmalara geç (8)