CALCULATE ve Filtre Koşulları

CALCULATE ile birlikte kullanabileceğimiz filtre koşullarıyla ilgili örnekleri biraz daha açalım: Önceki örneklerde ( 1, 2 ) yazdığımız filtre koşulları hep tek sütun üzerinde çalışan boolean tipi filtrelerdi : 'Ürünler' [Renk] = "Siyah" gibi.

Yazıların çoğunda kullandığım Contoso veritabanındaki 'Ürünler' tablosunun yapısı resimdeki gibi:

CALCULATE

Birim fiyatı birim maliyetinin 2 katından fazla olan ürünlerin satışlarını CALCULATE ve filtre koşulları yazarak hesaplamaya çalışalım.

Önce temel metriğimizi yazalım:

Satışlar := SUM('Satışlar'[Tutar])
[Birim Fiyat] ve [Birin Maliyet] sütunlarını filtre koşulu olarak kullanıp yüksek karlı ürün satışlarını hesaplamaya çalışalım:

Yüksek Karlı Ürün Satışları :=
CALCULATE ( [Satışlar] ;
    'Ürünler'[Birim Fiyat] >= 'Ürünler'[Birim Maliyet] * 2
)
calc filtercondition 2

Hata mesajı verip çalışmayı reddediyor, gerekçe olarak da beklediği şeyin tek sütun üzerinde çalışan True/False (boolean) tarzı bir koşul olduğunu fakat yazdığımız deyimin birden fazla sütun içerdiğini söylüyor.

CALCULATE ile birlikte kullandığımız filtre koşulları iki tipte olabilir :

Tek sütun üzerinde çalışan bir boolean koşulu, 'Ürünler'[Renk] = "Siyah" ya da 'Ürünler'[Birim Maliyet] > 10 gibi. Yazdığımız koşulun sonunda dönen şey, hangi  tek sütunu belirttiysek o sütunda ilgili koşulu sağlayan satırların tek sütunluk bir listesidir.

Ya da tablo formunda bir değer listesi kullanılabilir.

Yukarıda yazmaya çalıştığımız formülü, FILTER gibi koşula uyan satırları döndüren bir tablo fonksiyonu kullanarak yazabiliriz.

Yüksek Karlı Ürün Satışları :=
CALCULATE ( [Satışlar] ;
           FILTER ( 'Ürünler' ; 'Ürünler'[Birim Fiyat] >= 'Ürünler'[Birim Maliyet] * 2 )
)
calc filtercondition 3

Boolean tipindeki tek sütunluk filtrelerde, tabular engine' nin arka planda formülü ALL 'Tablo'[Sütun Adı] şeklinde açtığını yazmıştım.

Yukarıda yazdığımız aynı tablodaki iki farklı sütun değerini karşılaştıran FILTER versiyonlu formül mevcut filter context neyse ona uyarak çalışacaktır.

Siyah satırındaki hücre için mevcut filter context'i, rengi siyah olup fiyat sütunu maliyet sütünunun 2 katından fazla olan ürünlerin oluşturduğu context'tir. "Kategori" lerden "Bilgisayarlar" 'ı seçersek context'i, kategorisi bilgisayar olan siyah renkli ürünlerden fiyatı maliyetinden 2 kat fazla olan ürünler olarak değişecektir.

Ürünler tablosunu filtreleyen doğal filter context'i değiştirmek istersek ALL varyasyonunu yazabiliriz:

Yüksek Karlı TÜM Ürünlerin Satışları :=
CALCULATE ( [Satışlar] ;
    FILTER (
        ALL ( 'Ürünler' ) ;
        'Ürünler'[Birim Fiyat] >= 'Ürünler'[Birim Maliyet] * 2
    )
)
calc filtercondition 4

İlk formül mevcut filter context'e her zaman uyarken, ALL versiyonlu olan ALL ('Ürünler') ile ürünler tablosu üzerindeki tüm filtreleri önce kaldıracak sonra sadece ilgili koşula uyan satırların olduğu tabloyu döndürecektir.

calc filtercondition 5

Son bir örneği de, koşulda hem sütun hem de metrik kullanmaya ilişkin yapalım. Ortalama fiyatı hesaplayan temel bir metriğimiz olsun, ortalama fiyatın üstünde fiyatı olan ürünlerin satışlarını aşağıdaki gibi bir formülle bulabiliriz.

Ortalama Fiyatın Üzerindeki Ürünlerin Satışları :=
CALCULATE (
    [Satışlar];
    FILTER ( 'Ürünler'; 'Ürünler'[Birim Fiyat] >= [Ortalama Fiyat] )
)

FILTER'ın nasıl çalıştığına ilişkin bu, bu ve bu yazılara da göz atmanızı önereceğim. Çünkü FILTER bir iterator, yani "row context" yaratan bir fonksiyon, aynı zamanda bir tablo fonksiyonu. Doğal tablo ilişkilerinden ve rapor sayfasındaki diğer seçimlerden gelen filter context ile row context birlikte nasıl çalışıyor üzerinde düşünmekte fayda var.

Yazıdaki modeli indirebilirsiniz.

Sadece kayıtlı üyeler görebilir. Giriş veya Üyelik için login.

Bloga sosyal medya hesabınızla hızlı üyelik-giriş için ilgili ikonu tıklayabilirsiniz.

“CALCULATE ve Filtre Koşulları” üzerine 5 yorum

  1. Merhabalar; Oluşturmuş olduğum filtre ile üç sütunda yer alan değerler ile bir başka sütunda yer alan değerler arasında koşul oluşturarak filtre yapmak istiyorum. Yapmış olduğum koşul tabloda oluşuyor fakat hem listeleme çok uzun sürüyor hem de tüm sayfaya veya herhangi bir ölçüye uygulayamıyorum. Ölçüde oluşturulan koşul ile filtre oluşturula bilir mi yardımcı olabilir misiniz https://uploads.disquscdn.com/images/e0809a135abeba3dbf7471dd1773369425b016bb2bd5a71653f0a3531640ab84.png https://uploads.disquscdn.com/images/dc28414d8bd1bda395513c08b4de2e5b599b300e8bcedc9e5740f43b2a7b4145.png https://uploads.disquscdn.com/images/e67210c901f5ae1c3e128824d0c32e867912d64d1fd8ccef8ccf7f4d00a889f0.png

    Cevapla
    • Metrikleri -ölçü sizin deyiminizle- tek başına görsellere filtre olarak koyabiliriz, ama tüm sayfaya mevcut durumda filtre olarak koyamıyoruz. Tek tek görsellere metrikleri filtre olarak koymak işinizi çözüyorsa bunu kullanabilirsiniz. Bu formülü gözüken hesaplanmış sütunları DAX ile desktop tarafında değil Power Query tarafında conditional sütun olarak ekleyin, eklenen sütunlar genelde, her zaman değil PQ tarafında daha hızlı çalışır.

      Condition'ların sırası bile büyük tablolarda önem arzedebilir, yüksek olasılığı olan conditionları ilk sıraya düşük olasıklı condition'ları sonlarda yazın.

      Sütun yerine metrik yazarak çözmek de sorunuza cevap olabilir, eğer satıra sütuna getirmeyip sadece hücrelerde gösterecekseniz.

      Kullandığınız makinanın 32 ram ve makul işlemciye sahip olmasını öneririm.

      Cevapla
  2. Halil Bey tekrar teşekkür ederim koşulu söylediğiniz gibi Query'de sütun oluşturarak yaptım hem hız sorunu kalmadı hem de filtrelemeyi genişletebildim.

    Cevapla

Yorum yapın