CALCULATE Nasıl Çalışır? Filtre Bağlamını Adım Adım Değiştirmek
Beceri rehberi

CALCULATE Nasıl Çalışır? Filtre Bağlamını Adım Adım Değiştirmek

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

DAX CALCULATE nasıl çalışır: filtre ekleme, REMOVEFILTERS ile kaldırma, KEEPFILTERS, bağlam geçişi ve sık yapılan hatalar, örnek ölçülerle.

CALCULATE ne yapar: tek cümlelik model

CALCULATE, bir ifadeyi değiştirilmiş bir filtre bağlamında hesaplar. Microsoft'un belgesindeki tanım budur ve DAX'ta bundan daha önemli bir fonksiyon yok denecek kadar azdır. Çünkü Power BI'da bir ölçü her zaman bir bağlam içinde çalışır: Matristeki satır başlığı, dilimleyici seçimi, sayfa filtresi, görsel filtresi o hücrede hangi satırların hesaba girdiğini belirler. İşte bu bağlama filtre bağlamı (filter context) denir.

Sözdizimi sadedir: İlk parametre değerlendirilecek ifadedir, ölçü gibi çalışır. Ardından isteğe bağlı olarak bir ya da daha fazla filtre gelir. Bu filtreler üç türde olabilir: mantıksal (Boolean) filtre ifadeleri, tablo filtre ifadeleri ve filtre değiştirici fonksiyonlar.

Pratikte CALCULATE'e şu soruyu sorarsınız: "Şu hesabı, bağlamı şöyle değiştirerek yap." Bağlamı değiştirmek iki yönlüdür: Ya yeni bir filtre eklersiniz ya da var olanı kaldırırsınız. Aşağıdaki bölümler bu iki işin kuralını anlatır.

İlk adım: bir filtre eklemek

En basit kullanım, ölçüye sabit bir koşul eklemektir. Belgedeki örnek, rengi mavi olan ürünlerin gelirini veren ölçüdür: Satış tutarının toplamı, ürün tablosunun renk sütunu "Blue" iken hesaplanır. Yazılışı şöyledir:

Mavi Gelir = CALCULATE ( SUM ( Sales[Sales Amount] ), 'Product'[Color] = "Blue" )

Bu ölçüyü kategori satırlarına sahip bir matrise koyduğunuzda, her kategori satırında yalnızca mavi ürünlerin geliri görünür; genel toplamda ise tüm kategorilerin mavi gelirleri toplanır. Burada kritik ayrıntı şudur: CALCULATE'in filtresi, bağlamdaki aynı sütunun mevcut filtresini ezer. Matristeki satır başka bir renge filtrelense bile, ölçü mavi renge göre hesaplar. Belge bunu iki sonuçla anlatır: Sütun bağlamda yoksa yeni filtre eklenir, bağlamda varsa mevcut filtrenin üstüne yazılır.

Mantıksal filtre ifadelerinin kuralları vardır: Tek bir tablonun sütunlarına başvurabilir, ölçülere başvuramaz, iç içe CALCULATE içeremez ve tablo döndüren fonksiyonları yalnızca bir toplama fonksiyonunun argümanı olarak kullanabilir. Bu kuralların dışına çıkmanız gerektiğinde filtreyi FILTER fonksiyonuyla tablo filtresi olarak yazarsınız.

İkinci adım: filtre kaldırmak, pay hesaplamak

İş dünyasında çok istenen hesapların çoğu "bu değerin toplam içindeki payı" sorusuna dayanır. Payda için filtreyi bağlamdan çıkarmak gerekir. Belgedeki örnek kanal payıdır: Pay = DIVIDE ( kanalın satışı, CALCULATE ( toplam satış, REMOVEFILTERS ( 'Sales Order'[Channel] ) ) ). Paydadaki CALCULATE, kanal filtresini kaldırdığı için matrisin her satırında tüm kanalların toplamını verir. Pay, kanalın kendi satışının bu toplama bölünmesidir.

Filtre değiştirici fonksiyonlar şunlardır ve hangisini seçeceğiniz niyetinize bağlıdır: • REMOVEFILTERS: tüm filtreleri, bir tablonun tüm filtrelerini ya da belirli sütunların filtrelerini kaldırır. Belge, aracınız destekliyorsa filtre kaldırmak için bunun tercih edilmesini söyler. • ALL, ALLEXCEPT, ALLNOBLANKROW: sütun ya da tablodaki filtreleri kaldırır. ALLEXCEPT, belirttiğiniz sütunlar hariç hepsini temizler. • KEEPFILTERS: yeni filtreyi eklerken aynı sütundaki mevcut filtreyi ezmez, ikisini birleştirir. • USERELATIONSHIP: iki sütun arasındaki etkin olmayan ilişkiyi bu hesap için etkinleştirir. • CROSSFILTER: ilişkinin filtre yönünü değiştirir ya da ilişkiyi devre dışı bırakır.

Genel kural: Kaldırmak istiyorsanız REMOVEFILTERS, ezmek istemiyorsanız KEEPFILTERS, ilişkiyi değiştirmek istiyorsanız USERELATIONSHIP ya da CROSSFILTER.

Üçüncü adım: satır bağlamı ve bağlam geçişi

CALCULATE'in ikinci ve daha az fark edilen görevi, filtresiz kullanıldığında bile bir şey yapmasıdır: satır bağlamını filtre bağlamına çevirir. Buna bağlam geçişi (context transition) denir.

Satır bağlamı, hesaplanmış sütunlarda ve SUMX gibi yineleyici fonksiyonlarda ortaya çıkar; ifade "şu anki satır için" çalışır, ama o satırın ait olduğu ilişkili satırları otomatik olarak süzmez. Burada CALCULATE devreye girer ve geçerli satırı, o satırın tüm sütun değerlerini filtre olarak bağlama aktarır. Belge, bu geçişin; model ölçüsü olmayan, model verisini özetleyen bir ifadenin satır bağlamında değerlendirilmesi gerektiğinde gerektiğini belirtir. Bir model ölçüsünü satır bağlamında kullandığınızda ise geçiş otomatik olur.

Belgedeki müşteri segmenti örneği bunun iyi bir uygulamasıdır: Müşteri tablosunda hesaplanmış sütun, müşterinin gelirini CALCULATE içinde ALLEXCEPT ile (yalnızca müşteri anahtarı hariç filtreleri temizleyerek) toplar; belirli bir eşiğin altındaysa "Düşük", değilse "Yüksek" döner. Yani her müşteri satırı kendi gelirine bakar. Yineleyici içinde bir model ölçüsünü çağırdığınızda ise geçiş otomatik gerçekleşir; ölçü her satır için o satırın bağlamında hesaplanır.

Sık yapılan hatalar

Birincisi, filtre bağlamını görmeden formülü ezberlemektir. Aynı ölçü matrisin satırında, kartta ve toplamda farklı değer veriyorsa, sorun formülde değil hangi filtrenin o hücreye ulaştığındadır. Önce görselin bağlamını (satır başlığı, dilimleyici, sayfa filtresi) çıkarın, sonra CALCULATE'in ne ekleyip ne ezdiğine bakın.

İkincisi, Boolean filtrede ölçü kullanmaya çalışmaktır. "Gelir şundan büyük olan ürünler" gibi bir koşulda ölçüye başvuramazsınız; bunu FILTER içinde tablo filtresi olarak yazmak gerekir. FILTER, satır satır dolaştığı için büyük tablolarda yavaş olabilir; mümkün olduğunda sütun düzeyinde Boolean filtre tercih edilir.

Üçüncüsü, ezme davranışını unutmaktır. Dilimleyicide seçilmiş renkle ölçünün sabit rengi çakışırsa, seçim değil ölçünün rengi kazanır. Seçimi korumak istiyorsanız KEEPFILTERS kullanın.

Dördüncüsü, DirectQuery sınırıdır. Belge, CALCULATE'in hesaplanmış sütunlarda ve RLS kurallarında DirectQuery modunda desteklenmediğini belirtir. Beşincisi, hızlı çözüm olarak ALL kullanıp gereğinden fazla filtreyi silmektir: Pay hesabında yalnızca kanal filtresi kaldırılması gerekirken tüm tabloyu temizlemek, tarih ya da bölge dilimleyicilerini yok sayan yanlış payda üretir.

Çalışırken kontrol listesi

Yeni bir CALCULATE ifadesi yazarken şu sırayı izleyin:

  • Önce çıplak ifadeyi (filtresiz ölçüyü) yazın ve beklediğiniz değeri kendi gözünüzle doğrulayın.
  • Matristeki bağlamı yazın: hücrede hangi satırlar süzülüyor?
  • Eklemek istediğiniz filtrenin bağlamdaki aynı sütunu ezip ezmediğine karar verin. Ezmesini istemiyorsanız KEEPFILTERS ekleyin.
  • Kaldırmak istediğiniz filtreyi, olabildiğince dar kapsamla (tek sütun) REMOVEFILTERS'a verin.
  • Toplam satırını ayrıca kontrol edin; satırlar doğru olsa da toplam yanlış çıkabilir.
  • Performans Analizörü'nde ölçünün DAX sorgusunu kopyalayıp DAX sorgu görünümünde çalıştırın; böylece görselin gerçekte hangi filtreyi kullandığını görürsünüz.

Bu ölçüt, DAX'ın ileri konularının (zaman zekası, hesaplama grupları, sıralama) neredeyse tamamının temelidir. Zaman zekası ölçüleri de tipik olarak CALCULATE içinde tarih filtresini yeniden yazarak çalışır.

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

CALCULATE ve filtre bağlamı, Power BI'da ölçü yazan her analist için bir eşiktir; özellikle raporlardaki rakamların "neden tutmadığını" açıklayabilmesi gereken finans, satış analitiği ve kontrol ekipleri için önemlidir.

Power BI İleri Düzey ve DAX programı bunu iki ayrı modülle ele alır: "DAX Diline Derinlemesine Giriş" ve "CALCULATE ve Filtre Bağlamında Ustalaşmak". Sonraki modüller (zaman zekası, sıralama ve sınıflandırma, hesaplama grupları) bu temelin üstüne kurulur. Model tarafındaki ilişki ve filtre yönü kararları için Power BI Veri Modelleme programındaki yıldız şema başlığı destekleyici olur.

İlgili Mindset programı

Power BI İleri Düzey ve DAX

Sık sorulanlar

Sık sorulan sorular

CALCULATE ile FILTER arasındaki fark nedir?

CALCULATE bağlamı değiştirir, FILTER ise bir tabloyu koşula göre süzüp tablo döndürür. Basit sütun koşullarını CALCULATE'in içine doğrudan Boolean filtre olarak yazmak genelde yeterli ve daha hızlıdır. Ölçüye dayanan ya da birden fazla tabloyu ilgilendiren karmaşık koşullar için FILTER'ı CALCULATE'in filtre argümanı olarak kullanırsınız.

Bağlam geçişi ne zaman gerekir?

Satır bağlamında, yani hesaplanmış sütun ya da SUMX gibi yineleyicilerde, mevcut satırın değerleriyle model verisini özetlemek gerektiğinde gerekir. CALCULATE satır değerlerini filtre bağlamına aktarır. Bir model ölçüsünü satır bağlamında çağırdığınızda geçiş zaten otomatik olur, ayrıca yazmanız gerekmez.

CALCULATE içinde birden fazla filtre nasıl birleşir?

Virgülle ayrılan filtreler varsayılan olarak AND mantığıyla birleşir; hepsi sağlanmalıdır. Biri ya da diğeri anlamında OR istiyorsanız tek bir Boolean ifadede çift dikey çubukla bağlarsınız. Ancak OR koşulu yalnızca tek bir tablonun sütunlarını kapsayabilir; farklı tablolar için FILTER ile tablo ifadesi gerekir.

Neden CALCULATE sonucu dilimleyicideki seçimi yok sayıyor?

Aynı sütun için hem dilimleyici hem CALCULATE filtresi varsa, CALCULATE'in filtresi mevcut filtreyi ezer. Bu bilinçli bir davranıştır. Dilimleyici seçiminin korunmasını ve iki filtrenin kesişmesini istiyorsanız filtreyi KEEPFILTERS ile sarmalayın.

DAX CALCULATE Fonksiyonu: Filtre Bağlamını Değiştirme