FILTER, ALL ve Context Etkileşimi

Önceki yazıda FILTER kullanımına örnekler vermiştim, kısaca özetlemek gerekirse: FILTER, mevcut context'e yeni bir "condition" ekleyerek tabular engine'in gördüğü veri setini daraltır.

Kategorideki ürün sayısını ve siyah ürün sayısını hesaplamak üzere aşağıdaki gibi iki metriğimiz var.

Kategorideki Ürün Sayısı := COUNTROWS ( RELATEDTABLE ( 'Ürünler' ) )
Siyah Ürün Sayısı := COUNTROWS ( FILTER ( 'Ürünler'; 'Ürünler'[Renk] = "Siyah" ) )

Her ikisini de bir matrise düşürüyorum, renk için "slicer" ekleyip herhangi bir seçim yapmıyorum.

Daha önce yazdığım basit ama önemli cümleleri bir kez daha tekrarlayacağım: DAX ile yazdığınız her bir formül, her bir hücre için ayrı ayrı, ilgili filter context altında hesaplanır.

Matristeki "Bilgisayarlar" satırı için, "Kategorideki Ürün Sayısı" metriğinin gördüğü veri seti,  yani filter context'i , kategorisi bilgisayar olan ürünlerdir. Kategorisi bilgisayar olan 606 ürün saymış.

"Bilgisayarlar" satırı için "Siyah Ürün Sayısı" metriğinin gördüğü veri seti ise, kategorisi bilgisayar olan (tablolar arası ilişkilerden gelen orijinal filter context) ürünlerden rengi siyah olanlardır. FILTER komutu ile  mevcut orijinal filter context'i bir daha filtreledik.  Kategorisi bilgisayar olan 211 siyah ürün saymış.

Renk slicer'ından "Siyah" 'ı seçtiğimizde matrisin görünümü aşağıdaki gibi oluyor.


Her iki metrik de aynı değerleri gösteriyor. Renk olarak slicer'dan siyah seçildiği için, "Kategorideki Ürün Sayısı" metriğinin filter context'i artık rengi siyah olan ürünler oldu. Dolayısıyla her iki metrik  de, formülleri farklı olmasına rağmen, aynı veri setini görüp sayıyorlar: "Siyah olan ürünler".

Bu sefer slicer'dan "Kırmızı" yı seçiyorum. Matrisin görünümü değişti:


Filter context renk seçimiyle tekrar değişti: Her iki formülün de görebildiği veriseti, sadece rengi kırmızı olan ürünler. Kategorideki Ürün Sayısı metriği her bir kategorideki ürünleri sayarken sadece kırmızı renkli ürünleri görüyor. Kırmızı ürünler olarak değişen filter context içinde siyah ürün arayan diğer metrik ise haliyle hiçbir şey göremiyor ve boş (blank) döndürüyor.

Siyah ürünleri sayan metriğin formülünü ALL fonksiyonu ile farklı bir şekilde yazıyorum ve aynı matrise düşürüyorum.

Siyah Ürün Sayısı ALL := COUNTROWS ( FILTER ( ALL ( 'Ürünler' ); 'Ürünler'[Renk] = "Siyah" ) )


ALL ('Ürünler') dediğimizde tabular engine, 'Ürünler' tablosunu filtreleyen her türlü filtreyi, tablo ilişkilerinden gelen doğal filter context'i, "Bilgisayarlar" satırı için hesaplama yaparken "Bilgisayarlar" kategorisini, renk slicer'ından seçilen varsa herhangi bir rengi, hiçbirini umursamıyor, görmezden geliyor ve kaldırıyor. Yani  tüm 'Ürünler' tablosunu görüyor . Bu durumda formülün gördüğü ve saydığı veri seti, tüm ürünler içerisinde rengi siyah olanlar. Matrise ne koyarsanız koyun, renklerden hangisini seçerseniz seçin, TÜM ürünleri görüyor hesaplama yaparken.


ALL komutu, ALL( Tablo Adı) formunda kullanıldığında, ilgili tablo üzerinde -nereden gelirse gelsin- ne kadar filtre varsa hepsini kaldırır ve tüm tabloyu görür.

ALL fonksiyonunu ve diğer varyasyonlarını ( ALLEXCEPT, ALLSELECTED ) etkili bir şekilde kullanmak için CALCULATE fonksiyonuna ihtiyacımız var, şimdilik ALL ve ekürisinin, mevcut filter context'i görmezden gelebilecek yegane komut seti olduğunu not edebiliriz.

Yaklaşan Power BI Eğitimleri

Uçtan Uca Power BI, 5-6 Kasım
DAX ve Veri Modelleme, 12-13 Kasım