CALCULATE ile AND OR Kullanımı

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.

Yaklaşan Power BI Eğitimleri

Uçtan Uca Power BI, 24-25 Eylül
DAX ve Veri Modelleme, 1-2 Ekim