CALCULATE ile AND OR Kullanımı

Güncelleme : 21 Mart 2021, 2021 Mart güncellemesi ile birlikte CALCULATE altında OR kullanımında yazım olarak bazı değişikliklere gidildi: Aynı filtre içerisinde aynı tablodan birden fazla farklı sütun çağrılabiliyor artık. İlgili yazı için buradan.

CALCULATE fonksiyonunun Boolean tipinde filtreler kulllanıldığında yazımı şu şekilde:

Metrik := CALCULATE ( Hesaplanacak deyim; Koşul 1; Koşul 2; ...; Koşul N )

Bu yazım şeklinde filtrelerin 'Ürünler'[Renk] = "Kırmızı" veya 'Ürünler'[Fiyat] > 10 gibi olması gerektiğini daha önce belirtmiştim.

Birden fazla filtre kullanıldığında, CALCULATE 'tin yukarıdaki yazım şekli, verilen filtreleri AND ile birleştirir.

Modelimizdeki markası "Contoso" VE rengi "siyah" olan ürünlerin satışlarını hesaplayalım.

Satışlar := SUM ('Satışlar'[Tutar])
Contoso Siyah :=
CALCULATE (
    [Satışlar];
    'Ürünler'[Marka] = "Contoso";
    'Ürünler'[Renk] = "Siyah"
)

Bu metrikleri düşürdüğümüz matrisin satırında veya sütununda Marka ve-veya Renk olursa formül bunları umursamayacaktır.


Fakat renk ve marka haricinde context yaratan her şeye uyacaktır. Matrise "Üreticileri" de düşürüyorum.
Fabrikam Inc ve Litware Inc isimli üreticilerin olduğu  satırlar için formül hesaplama yapmaya başlamadan önce gördüğü context, üreticisi Fabrikam Inc ve Litware Inc olan kayıtlar. Bu kayıtlarda markası Contoso olan siyah ürün yok! Eğer olsaydı, hesaplayacağı şey, ilgili üretici için markası Contoso ve rengi siyah olan ürünler olacaktı ve bu rakamı her satır için tekrarlayacaktı.

Bu durumu matrise üretici yerine ürün kategorilerini düşürdüğümüzde görebiliriz.


CALCULATE 'e giriş yazısında verdiğim örneklerde olduğu gibi bu formülün de açılımı benzer mantıkta: Ürünler tablosundaki  [Marka] ve [Renk] sütunlarını filtreleyen her şeyi kaldır, yerine kendi context'ini yarat; markası Contoso VE rengi siyah olan ürünler.

Contoso Siyah Açılım :=
CALCULATE (
    [Satışlar];
    FILTER (
        ALL ( 'Ürünler'[Marka]; 'Ürünler'[Renk] );
        AND ( 'Ürünler'[Marka] = "Contoso" ; 'Ürünler'[Renk] = "Siyah" )
    )
)

Açılım formülünde iki koşulu AND ile birleştirdik.
AND operatörünün kullanımı basit :

AND ( Koşul 1; Koşul 2 )

AND yerine && kullanabiliriz:

( Koşul 1 && Koşul 2 )

Dolayısıyla yukarıdaki formül şöyle de yazılabilir:

Contoso Siyah Açılım && := 
CALCULATE (
    [Satışlar];
    FILTER (
        ALL ( 'Ürünler'[Marka]; 'Ürünler'[Renk] );
            ( 'Ürünler'[Marka] = "Contoso" && 'Ürünler'[Renk] = "Siyah" )
    )
)

Açılımları yazıyorum, çünkü CALCULATE ile booelan tipi filtreler kullanıldığında bu davranışı iyice anlamak önemli.

Daha önce FILTER kalıbıyla tek sütun üzerinden yaptığımız örnekleri tekrarlayalım:

Contoso Siyah FILTER := 
CALCULATE (
    [Satışlar];
    FILTER (
        'Ürünler';
        AND ( 'Ürünler'[Marka] = "Contoso" ; 'Ürünler'[Renk] = "Siyah" )
    )
)

Bu formül çalışırken mevcut context'i dikkate alacaktır, çünkü içeriğinde ALL vs gibi context'i değiştiren herhangi bir yapı yok.

Matrise düşürelim.

FILTER versiyonlu formül mevcut filter context'i dikkate alarak çalışıyor, Bilgisayar–>Contoso–>Beyaz satırı için gördüğü context'te siyah ürün yok, dolayısıyla boş döndürüyor. Contoso Siyah formülü, [Marka] ve [Renk] sütunlarındaki filtreleri umursamadığı için aynı rakamı her satır için tekrarlıyor fakat bunun haricinde bir filtre geldiğinde buna riayet ediyor, kategori değiştiğinde ilgili kategorideki Contoso markalı siyah ürünlerin satışını hesaplıyor.

Dip toplam her iki formülde de aynı !  Çünkü her iki metriğin de dip toplam satırını hesaplarken gördüğü context aynı!

FILTER ve ALL varyasyonlu bir formül daha yazalım:

Contoso Siyah FILTER ALL :=
CALCULATE (
    [Satışlar];
    FILTER (
        ALL ( 'Ürünler' );
        AND ( 'Ürünler'[Marka] = "Contoso" ; 'Ürünler'[Renk] = "Siyah" )
    )
)

Bu formüldeki FILTER ( ALL ('Ürünler') ile, Ürünler tablosunu filtreleyen her şeyi kaldırdık, sonra markası Contoso olan siyah ürünlerin satışlarını hesaplayacağız dedik.

 Dip toplamlar her üç formülde de aynı! Cevabı gene gördükleri context 'te yatıyor.


Standart yazımda filtre koşulları AND ile birleşiyor dedik, OR ile bir koşul yazmak gerekirse ne yapacağız?

Örneğin rengi siyah VEYA mavi ürünleri nasıl hesaplayacağız?

Markası Contoso VEYA siyah ürünleri nasıl hesaplayacağız?

Eğer tek sütun üzerinden bir OR koşulu yazmak istiyorsak, standart yazım şeklini kullanabiliriz:

Siyah veya Mavi Ürünler :=
CALCULATE (
    [Satışlar];
    OR ( 'Ürünler'[Renk] = "Siyah" ; 'Ürünler'[Renk] = "Mavi" )
)

Veya || kullanarak da aynı formülü yazabiliriz.

Siyah veya Mavi Ürünler || := 
CALCULATE (
    [Satışlar];
    'Ürünler'[Renk] = "Siyah" || 'Ürünler'[Renk] = "Mavi" 
)

Birden fazla sütun üzerinden bir OR koşulu yazmak istersek standart yazım şeklini kullanamayız! Hata mesajı verecektir.

Siyah veya Contoso Hatalı := 
CALCULATE (
    [Satışlar];
    OR ( 'Ürünler'[Marka] = "Contoso" ; 'Ürünler'[Renk] = "Mavi" )
)


Çünkü beklediği şey tek sütun üzerinden bir boolean koşulu.

Birden fazla sütun olduğunda FILTER kalıbını kullanmalıyız:

Siyah veya Contoso :=
CALCULATE (
    [Satışlar];
    FILTER (
        'Ürünler';
        OR ( 'Ürünler'[Renk] = "Siyah"; 'Ürünler'[Marka] = "Contoso" )
    )
)

AND ( Koşul 1 ; Koşul 2 ) ve OR (Koşul 1 ; Koşul 2 ) yazımından da anlaşılacağı üzere iki tane koşul kabul ediyor. İkiden fazla koşul yazmak istediğinizde tekrar bir AND -veya OR- parantezi içine alabilirsiniz veya && ile || kullanarak istediğiniz sayıda koşulu birleştirebilirsiniz.

Yazıdaki modeli indirebilirsiniz.

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