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.

“FILTER” üzerine 2 yorum

  1. Merhaba, filter yerine calculate kullanmak daha hizli olmaz mi? Burada calculate formülünün dezavantaji olur mu?
    Teşekkürler.

    Cevapla
  2. Kesinlikle doğru, formüllerin bazıları CALCULATE ile de yazılabilir ve tabloların büyük olması durumunda daha etkili çalışır. Aynı sonucu veren bir kaç farklı formülü çalışma mantıklarıyla beraber bu yazıda da örnek göstermiştim.

    Benzer şekilde, daha önceki yazı konularından RELATED ve RELATEDTABLE komutlarının da büyük çoğunluğu CACULATE ile yazılabilir.

    CALCULATE güçlü bir foksiyon, buna gelmeden önce temel konsept ve kavramları anlamak önemli, bu yüzden belli bir sıralamada aktarıyorum.

    Hiçbir dezavantaj olmaz, aksine kullanılması gereken -en azından yukarıdaki örnekler için- en doğru yöntem olur.

    Cevapla

Yorum yapın