FILTER

FILTER tablo fonksiyonlarından biri, yani döndürdüğü şey bir tablo, aynı zamanda bir iterator. Yani üzerinde çalıştığı tablodaki her bir satır için işlem yapar.

Yazımı gayet basit :

FILTER ( üzerinde çalışılacak tablo; her bir satır için test edilecek deyim-condition )

FILTER'ın sonucunda geri dönen tablo, orijinal tabloyla aynı sütunlara sahip, fakat sadece verilen "condition"'a uyan satırların olduğu tablodur.

FILTER, genellikle bizden bir tablo isteyen diğer fonksiyonlarla birlikte kullanılır. Daha önceki yazılarda bahsettiğim, SUMX, RELATEDTABLE ve sayma fonksiyonlarıyla birlikte FILTER'ın kullanımlarını örneklendirelim.

Yazıda kullanılan modelin tablolar arası ilişkileri ekteki gibi:

Satışlar := SUMX ('Satışlar'; 'Satışlar'[Miktar] * 'Satışlar'[Fiyat] )
Fiyatı 100 den Büyük Olan Ürünlerin Satışı :=
SUMX (
    FILTER ( 'Satışlar'; 'Satışlar'[Fiyat] > 100 );
    'Satışlar'[Miktar] * 'Satışlar'[Fiyat]
)

Dönen tablo, mevcut filter context altında görünen Satışlar tablosunun, Fiyat sütunu 100'den büyük olan satırları.

Cümleleri biraz daha ilerletelim: Her bir Ürün Kategorisinde kaç tane "Mavi" renkli ürün olduğunu, Ürün Kategorileri  tablosuna bir  hesaplanmış sütun  olarak getirelim.

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


Aynı formülü hesaplanmış sütun olarak değil de, bir metrik olarak yazsak ve her ikisini de bir matrise düşürsek ne olur ?

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


Her ikisi de aynı gibi duruyor? Renk slicer'ından "Gümüş" 'ü seçelim:


Metrik olan herhangi bir şey göstermiyor, fakat hesaplanmış sütun çalışmaya devam ediyor!

Formül aynı da olsa, metriğin gördüğü "filter context" ile hesaplanmış sütunun gördüğü "filter context" aynı değil. Metriğin görebildiği satırlar, yani filter context'i, sadece gümüş renkli ürün içeren kategoriler. Dolayısıyla mavi renkli hiçbir şey görmediğinden bir rakam döndürmüyor.

Aynı formül, hesaplanmış sütun mantığıyla tablo seviyesinde her bir satır için işlem yaparken tüm satırları görüyor,  yani filter context'i tüm kategorilere ait tüm ürünler. 

DAX ile formül yazarken, metrik, hesaplanmış sütun, mevcut context nedir konularını doğru anlamak önemli. Ve soruyu "doğru parçalara bölüp" nasıl hesaplayabileceğinizi tasarlamalısınız.

Bir kademe daha farklı bir formül yazmaya çalışalım: Hiç satışı olmayan ürünlerin sayısını bulmak istiyoruz diyelim.

DAX Man gibi düşünmeye çalışırsak :

  • Ürünler tablosunu filtreleyeceğiz . Bize bir FILTER ( 'Ürünler') lazım.
  • Bu filtrelenmiş tablonun satır sayısı lazım. COUNTROWS ( FILTER ( 'Ürünler'). Formülün ilk kısmını yazdık.
  • Hangi ürünleri filtreleyeceğiz, her bir ürün için ilgili satırları  Satışlar tablosunda bulup, hiç satır döndürmeyen -yani hiç satışı olmayan- ürünleri bulmamız lazım. COUNTROWS ( RELATEDTABLE ('Satışlar') = 0 . Condition filtresini de yazdık.

Artık hepsini birleştirebiliriz:

Hiç satışı olmamış ÜRÜN # :=
COUNTROWS (
    FILTER ( 'Ürünler'; COUNTROWS ( RELATEDTABLE ( 'Satışlar' ) ) = 0 )
)

Çok benzer başka bir şey hesaplamaya çalışalım: Kırmızı renkli ürünlerin satışlarını nasıl bulabiliriz?

Formüle bakmadan önce lütfen kendi cümlelerinizi kurun, formül parçalarını yazın, sonra hepsini birleştirin!

Kırmızı Renkli Ürün Satışları
 :=
SUMX (
    FILTER ( 'Satışlar'; RELATED ( 'Ürünler'[Renk] ) = "Kırmızı" );
    'Satışlar'[Miktar] * 'Satışlar'[Fiyat]
)

Hem FILTER hem de RELATEDTABLE tablo fonksiyonlarıdır. Yukarıdaki örneklerde olduğu içi içe kullanımlarda (nested) , hesaplama en içteki fonksiyondan başlar.

FILTER fonsiyonuna birden fazla condition'ı aynı anda yazmak isterseniz AND ( ) içine alabilirsiniz.

FILTER ( 'Tablo'; AND ( condition 1 ; condition 2 ) )

Ya da içiçe FILTER şeklinde de yazabilirsiniz.

FILTER ( FILTER ( 'Tablo'; condition 1 ) ; conditon 2 ))

Teorik olarak yukarıdaki her iki formül de aynı sonucu döndürse de filtrelediğiniz tablonun satır sayısına göre performans aynı olmayabilir.

İlk formül, yani AND (  ) olan, her iki condition testini ilgili tablonun  tüm satırlarına  uygular.

Diğeri ise önce "condition 1" 'i uygular,  kalan satırlar üzerinden  en dıştaki FILTER çalışır.

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,  17-18 Aralık
DAX ve Veri Modelleme, 24-25 Aralık