CALCULATE ve Filtre Koşulları

CALCULATE ile birlikte kullanabileceğimiz filtre koşullarıyla ilgili örnekleri biraz daha açalım: Önceki örneklerde ( 1, 2 ) yazdığımız filtre koşulları hep  tek sütun  üzerinde çalışan  boolean tipi  filtrelerdi :  'Ürünler' [Renk] = "Siyah"  gibi.

Yazıların çoğunda kullandığım Contoso veritabanındaki 'Ürünler' tablosunun yapısı resimdeki gibi:

Birim fiyatı birim maliyetinin 2 katından fazla olan ürünlerin satışlarını CALCULATE ve filtre koşulları yazarak hesaplamaya çalışalım.

Önce temel metriğimizi yazalım:

 Satışlar := SUM('Satışlar'[Tutar]) 
[Birim Fiyat] ve [Birin Maliyet] sütunlarını filtre koşulu olarak kullanıp yüksek karlı ürün satışlarını hesaplayalım:

Yüksek Karlı Ürün Satışları := 
CALCULATE ( [Satışlar];
    'Ürünler'[Birim Fiyat] >= 'Ürünler'[Birim Maliyet] * 2
)


Hata mesajı verip çalışmayı reddediyor, gerekçe olarak da beklediği şeyin tek sütun üzerinde çalışan True/False (boolean) tarzı bir koşul olduğunu fakat yazdığımız deyimin birden fazla sütun içerdiğini söylüyor.

CALCULATE ile birlikte kullandığımız filtre koşulları iki tipte olabilir :

 Tek sütun  üzerinde çalışan bir boolean koşulu, 'Ürünler'[Renk] = "Siyah" ya da 'Ürünler'[Birim Maliyet] > 10 gibi. Yazdığımız koşulun sonunda dönen şey, hangi  tek sütunu belirttiysek o sütunda ilgili koşulu sağlayan satırların tek sütunluk bir listesidir.

Ya da tablo formunda bir değer listesi kullanılabilir.

Yukarıda yazmaya çalıştığımız formülü, FILTER gibi koşula uyan satırları döndüren bir tablo fonksiyonu kullanarak yazabiliriz.

Yüksek Karlı Ürün Satışları :=
CALCULATE ( [Satışlar];
           FILTER ( 'Ürünler'; 'Ürünler'[Birim Fiyat] >= 'Ürünler'[Birim Maliyet] * 2 )
)


Boolean tipindeki tek sütunluk filtrelerde, tabular engine' nin arka planda formülü ALL 'Tablo'[Sütun Adı] şeklinde açtığını yazmıştım.

Yukarıda yazdığımız aynı tablodaki iki farklı sütun değerini karşılaştıran FILTER versiyonlu formül  mevcut filter context neyse ona uyarak  çalışacaktır.

Siyah satırındaki hücre için mevcut filter context'i, rengi siyah olup fiyat sütunu maliyet sütünunun 2 katından fazla olan ürünlerin oluşturduğu context'tir. "Kategori" lerden "Bilgisayarlar" 'ı seçersek context'i, kategorisi bilgisayar olan siyah renkli ürünlerden fiyatı maliyetinden 2 kat fazla olan ürünler olarak değişecektir.

Ürünler tablosunu filtreleyen doğal filter context'i değiştirmek istersek ALL varyasyonunu yazabiliriz:

Yüksek Karlı TÜM Ürünlerin Satışları := 
CALCULATE ( [Satışlar];
    FILTER (
        ALL ( 'Ürünler' );
        'Ürünler'[Birim Fiyat] >= 'Ürünler'[Birim Maliyet] * 2
    )
)


İlk formül mevcut filter context'e her zaman uyarken, ALL versiyonlu olan ALL ('Ürünler') ile ürünler tablosu üzerindeki tüm filtreleri önce kaldıracak sonra sadece ilgili koşula uyan satırların olduğu tabloyu döndürecektir.

Son bir örneği de, koşulda hem sütun hem de metrik kullanmaya ilişkin yapalım. Ortalama fiyatı hesaplayan temel bir metriğimiz olsun, ortalama fiyatın üstünde fiyatı olan ürünlerin satışlarını aşağıdaki gibi bir formülle bulabiliriz.

Ortalama Fiyatın Üzerindeki Ürünlerin Satışları :=
CALCULATE (
    [Satışlar];
    FILTER ( 'Ürünler'; 'Ürünler'[Birim Fiyat] >= [Ortalama Fiyat] )
)

FILTER'ın nasıl çalıştığına ilişkin bu, bu ve bu yazılara da göz atmanızı önereceğim. Çünkü FILTER bir iterator, yani "row context" yaratan bir fonksiyon, aynı zamanda bir tablo fonksiyonu. Doğal tablo ilişkilerinden ve rapor sayfasındaki diğer seçimlerden gelen filter context ile row context birlikte nasıl çalışıyor üzerinde düşünmekte fayda var.

Yazıdaki modeli indirebilirsiniz.

Sadece kayıtlı üyeler görebilir. Giriş veya Üyelik için login.

Yaklaşan Power BI Eğitimleri

Uçtan Uca Power BI, 24-25 Eylül
DAX ve Veri Modelleme, 1-2 Ekim