DAX FILTER: Satır Satır Koşul Değerlendiren Tablo Filtresi
Beceri rehberi

DAX FILTER: Satır Satır Koşul Değerlendiren Tablo Filtresi

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 5 dk okuma

FILTER, bir tabloyu satır satır dolaşıp koşulu sağlayan satırları tablo olarak döndürür. Asıl beceri, FILTER'ı basit bir koşulun yetmediği yerde kullanmak ve dolaştığı tabloyu dar tutmaktır.

Bir bakışta

  1. FILTER bir değer değil, tablo döndürür. Tek başına bir hücreye yazılmaz; CALCULATE, SUMX ya da COUNTROWS gibi tablo bekleyen işlevlerin içinde kullanılır.
  2. Koşulu her satır için ayrı değerlendiren bir iteratördür. Bu yüzden satır sayısı büyüdükçe maliyeti artar; neyi dolaştığınız performansı belirler.
  3. Mümkünse CALCULATE içinde basit koşul yazın. Bellekteki sütunlu yapı basit koşulları daha verimli işler; FILTER yalnızca gerektiğinde kullanılmalıdır.
  4. FILTER, ölçüye dayanan koşulda zorunludur. Basit koşul ölçüye, birden çok tabloya ya da tablo döndüren işleve başvuramaz.
  5. Tablonun tamamı yerine sütunu filtrelemek hem hızlıdır hem güvenlidir. VALUES ile alınan tekil değerler tablosu, tüm tablodan çok daha az satır dolaştırır.

FILTER ne yapar?

FILTER, filtrelenecek tabloyu ve bu tablonun her satırı için değerlendirilen mantıksal ifadeyi alır. Sözdizimi şöyledir:

FILTER(<tablo>, <koşul>)

Sonuç, koşulu sağlayan satırlardan oluşan bir tablodur. Bu nedenle FILTER tek başına bir ölçünün sonucu olamaz; tabloyu bekleyen bir işlevin içine yerleştirilir. Toplamı hesaplayan SUMX, satırları sayan COUNTROWS ve bağlamı değiştiren CALCULATE en yaygın ortaklarıdır.

Örnek olarak ürün satırları arasında kırmızı olanların satış toplamını alalım:

Kırmızı Satış = SUMX(FILTER('Satışlar', RELATED('Ürün'[Renk]) = "Kırmızı"), 'Satışlar'[Tutar])

FILTER her satış satırına bakar, ilişkili ürünün rengi kırmızı ise satırı tutar. SUMX bu satırların tutarlarını toplar. Burada RELATED, satış satırından ürün tablosundaki renge ulaşmayı sağlar.

Power BI'daki FILTER, Excel'in dinamik dizi filtre fonksiyonundan farklıdır: biri veri modelinde tablo üretir, diğeri hücre aralığı döndürür. Adlar benzer, ancak kullanım yeri ve mantık aynı değildir.

CALCULATE içindeki basit koşulla farkı

CALCULATE'a filtre vermenin yollarından biri basit bir Boolean ifadedir:

Kırmızı Satış = CALCULATE([Toplam Satış], 'Ürün'[Renk] = "Kırmızı")

Diğeri FILTER ile verilen tablo ifadesidir:

Kırmızı Satış = CALCULATE([Toplam Satış], FILTER('Ürün', 'Ürün'[Renk] = "Kırmızı"))

Bu ifadelerin her biri kırmızı ürünlerin satışını verir. Aralarındaki fark verimliliktedir. Import modundaki tablolar bellekte sütun deposu olarak tutulur ve basit koşullar bu yapıya göre optimize edilmiştir. Microsoft'un DAX en iyi uygulamaları rehberi, mümkün olduğunda filtre argümanlarının Boolean ifade olarak verilmesini önerir. FILTER ise koşulu her satır için ayrıca değerlendirir. Ayrıca FILTER ile verilen tablo ifadesi, Ürün tablosundaki mevcut filtrelerin yerini alır. Boolean biçimde Renk sütunundaki mevcut seçimi korumak istiyorsanız Microsoft'un önerdiği gibi koşulu KEEPFILTERS ile sarın: CALCULATE([Toplam Satış], KEEPFILTERS('Ürün'[Renk] = "Kırmızı")).

Basit koşulun sınırları vardır. Birden çok tablodaki sütunlara başvuramaz, ölçü kullanamaz, iç içe CALCULATE içeremez ve tablo döndüren ya da tarayan işlevleri çağıramaz. Bu sınırlara takıldığınızda FILTER devreye girer.

Şekil 1

Basit koşul sütunu doğrudan süzer, FILTER tabloyu satır satır dolaşır

CALCULATE içindeki filtre biçimleri

Boolean ifadeFILTER ile tablo ifadesi
BiçimSütun = değer gibi basit koşulFILTER(tablo, koşul) çağrısı
DeğerlendirmeSütun üzerinde doğrudanTablonun her satırı için ayrı
PerformansGenellikle daha verimliSatır sayısı arttıkça pahalı
Ölçüye başvurmaBaşvuramazBaşvurabilir
Birden çok tabloBaşvuramazBaşvurabilir
Ne zamanMümkün olan her durumdaBasit koşulun yetmediği durumlarda
Kaynak: Microsoft Learn: Avoid using FILTER as a filter argument in DAXMindset Institute

FILTER'ın gerçekten gerektiği durumlar

Bazı durumlar FILTER'ı zorunlu kılar.

  • Koşul bir ölçüye dayanıyorsa. Yalnızca kâr eden aylardaki satışı görmek istiyorsanız, kârı hesaplayan ölçüyü her ay için değerlendirmeniz gerekir:

Kârlı Aylarda Satış = CALCULATE([Toplam Satış], FILTER(VALUES('Takvim'[Ay]), [Kâr] > 0))

  • Sütunları birbiriyle karşılaştırıyorsanız. Birim fiyatı birim maliyetin altında kalan satırlar için:

Zararına Satış = CALCULATE([Toplam Satış], FILTER('Satışlar', 'Satışlar'[Birim Fiyat] < 'Satışlar'[Birim Maliyet]))

  • Koşulda VEYA mantığı farklı tablolardaki sütunları birleştiriyorsa. Ürün rengi kırmızı olan ya da müşteri segmenti kurumsal olan satışlar gibi bir koşulu basit koşulla yazamazsınız; FILTER içinde || işleci kullanılır. Aynı sütundaki seçenekler (kırmızı ya da mavi) ise basit koşulla da yazılabilir.

Bu durumlarda FILTER'ın maliyeti gerekçelidir. Yine de ilk sorunuz her zaman "bunu basit koşulla yazabilir miyim" olmalıdır.

Tabloyu mu sütunu mu filtrelemelisiniz?

FILTER'ın ilk argümanı neyi dolaşacağını belirler. Büyük bir olgu tablosunu doğrudan verirseniz FILTER her satış satırına bakar. Oysa koşul sıklıkla bir boyut sütunundaki tekil değerlere dayanır; bu durumda VALUES ile yalnızca o sütunun tekil değerlerini alıp onları filtrelemek çok daha az iş yapar. Kârlı aylar örneğinde FILTER satış satırlarını değil, ay değerlerini dolaşıyor.

FILTER'ın ürettiği tablo, hesaplanan ölçünün geçerli filtre bağlamında çalışır. Yani FILTER('Ürün', ...) yalnızca bağlamda görünen ürünlere bakar. Raporda seçilen filtreleri yok saymak istiyorsanız tabloyu ALL ile vermeniz gerekir: FILTER(ALL('Ürün'), ...) bütün ürünleri değerlendirir.

Bu seçim, ölçünün raporda nasıl davrandığını doğrudan etkiler. Aynı kırmızı ürün koşulu, bir dilimleyici seçimine saygı gösterebilir ya da onu geçersiz kılabilir; hangisini istediğinize önceden karar verin.

Şekil 2

FILTER ürettiği tabloyu CALCULATE'a verir, ölçü yeni bağlamda hesaplanır

FILTER içeren bir ölçünün zinciri

  1. Mevcut filtre bağlamıRapordaki seçimler ve satır-sütun gruplaması.
  2. FILTER tablosuKoşulu sağlayan satırlar tablo olarak üretilir.
  3. CALCULATEÜretilen tabloyu yeni filtre olarak uygular.
  4. Ölçü sonucuToplam, yeni bağlamda hesaplanır.
Kaynak: sayfa içeriğiMindset Institute

Sayım ve diğer sık kullanımlar

FILTER yalnızca toplam almak için kullanılmaz. Koşulu sağlayan satırları saymak için COUNTROWS ile birleşir:

Büyük Sipariş Sayısı = COUNTROWS(FILTER('Siparişler', 'Siparişler'[Tutar] > [Eşik Tutar]))

Burada eşik bir ölçüden geldiği için FILTER gereklidir. Satır sayısını COUNT yerine COUNTROWS ile almak, tablo ifadelerinde genel tavsiye edilen yoldur.

Bir diğer kullanım hesaplanmış tablodur: FILTER bir tablodan alt küme çıkarıp onu yeni bir tablo olarak veri modeline ekler. Örneğin yalnızca aktif müşterilerden oluşan bir tablo bu şekilde üretilebilir. Burada da koşulu basitçe yazabildiğiniz durumlarda diğer tablo işlevlerine bakmak yararlı olur.

DirectQuery kipinde FILTER, hesaplanmış sütunlarda ve satır düzeyi güvenlik kurallarında desteklenmez. Veri kaynağınız DirectQuery ise ölçü içinde kullanmak gerekir.

Sık hatalar ve kontrol listesi

FILTER'la ilgili hatalar genellikle şunlardır.

  • Basit koşul yeterken FILTER kullanmak. Sonuç doğrudur ama yavaştır.
  • FILTER'ı bir ölçünün tek başına sonucu saymak. Tablo döndüğü için ölçü hata verir; COUNTROWS, SUMX ya da CALCULATE ile sarın.
  • Büyük bir olgu tablosunu doğrudan FILTER'a vermek. Boyut sütunundaki tekil değerler üzerinden filtrelemek çoğu zaman yeterlidir.
  • ALL kullanıp rapordaki seçimlerin yok sayıldığını fark etmemek.
  • Ölçüyü koşulda kullanıp sonuç beklenmedik çıktığında bağlam geçişini düşünmemek.

Ölçüyü yazdıktan sonra kontrol listesi: koşul gerçekten Boolean ile yazılamıyor mu, FILTER'ın dolaştığı tablo en dar olan mı, seçimleri saymak ya da yok saymak istediniz mi, sonuç elle hesapladığınız küçük bir örnekle tutuyor mu? Yanıtlar tamamsa ölçü hem doğru hem verimli olur.

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Uygulamalı Power BI ile Veri Analitiği ve Görselleştirme Sertifika Programı, DAX analiz dili ve kullanımı başlığıyla ölçü yazmanın temelini verir. Power BI İleri Düzey ve DAX programı, CALCULATE ve filtre bağlamı ile performans optimizasyonu başlıklarında bu konunun derinine iner. Rapor geliştiren analistler ve BI uzmanları için filtre mantığı ölçü yazmanın merkezidir.

İlgili Mindset programı

Uygulamalı Power BI ile Veri Analitiği ve Görselleştirme Sertifika Programı

Sık sorulanlar

Sık sorulan sorular

FILTER neden tek başına bir ölçü olarak yazılamaz?

Çünkü FILTER bir tablo döndürür, ölçüler ise tek bir değer bekler. Ölçüde FILTER'ı kullanmak için sonucu bir işlevle değere dönüştürmek gerekir: satırları saymak için COUNTROWS, toplamak için SUMX ya da filtre olarak uygulamak için CALCULATE.

FILTER ile VALUES neden sık birlikte kullanılır?

VALUES bir sütunun tekil değerlerini içeren küçük bir tablo üretir. FILTER bu tabloyu dolaştığında satış satırlarını değil, tekil değerleri değerlendirir. Böylece ölçüye dayalı koşullar, örneğin kâr eden aylar, çok daha az satır üzerinde hesaplanır.

FILTER içinde ölçü kullanabilir miyim?

Evet, FILTER'ın en güçlü yanlarından biri budur. Koşul bir ölçüye dayandığında basit CALCULATE filtresi çalışmaz; FILTER ise ölçüyü her satır için değerlendirir. Ölçü, bağlam geçişi sayesinde her satır için o satıra özgü hesaplanır.

FILTER içinde ALL ne işe yarar?

ALL, tabloyu mevcut filtre bağlamından bağımsız verir. FILTER(ALL(tablo), koşul) tablonun bütün satırlarına bakar ve rapordaki dilimleyici seçimlerini yok sayar. Seçimleri korumak istiyorsanız tabloyu doğrudan verin. Bu fark, bir ürünün tüm ürünler içindeki payı gibi karşılaştırmalı ölçülerde belirleyicidir.

FILTER DirectQuery modunda çalışır mı?

Ölçü içinde çalışır. Ancak DirectQuery kipinde hesaplanmış sütunlarda ve satır düzeyi güvenlik kurallarında desteklenmez. Bu kısıtlama Microsoft'un işlev belgesinde belirtilmiştir; kaynağınız DirectQuery ise ilgili kullanım yerini kontrol edin.

FILTER içinde birden çok koşul nasıl yazılır?

Koşulları && işleciyle birleştirirseniz hepsinin sağlanması, || işleciyle birleştirirseniz herhangi birinin sağlanması gerekir. Hepsinin sağlanması yeterliyse CALCULATE içinde birden çok basit koşulu ayrı filtre argümanı olarak yazmak da genellikle daha verimlidir; ancak basit koşulların ilgili sütunlardaki mevcut filtrelerin yerini aldığını, gerekirse KEEPFILTERS kullanmak gerektiğini unutmayın.

DAX FILTER Fonksiyonu: Kullanımı ve CALCULATE ile Farkı