CALCULATE ve IN Kullanımı

Önceki yazıda OR ile CALCULATE 'in kullanımına ilişkin örnekler vardı, bu örnekleri IN ile biraz daha açalım.

Örnekleri tekrarlamak gerekirse aşağıdaki iki formül de aynı, sadece OR yerine || kullanıldı:

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

Yukarıdaki formüllerin okuması daha kolay olan bir alternatifi daha var:

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


( ) yerine { } kullanıldığına dikkat!

Formüldeki filtre "boolean" tipinde bir filtre, dolayısıyla bunun internal açılımının aşağıdaki gibi olduğunu tekrarlamakta fayda var.

Siyah veya Mavi Ürünler IN Açılım := 
CALCULATE(
    [Satışlar];
    FILTER ( ALL ('Ürünler'[Renk]);
        'Ürünler'[Renk] IN {"Siyah" ; "Mavi"}
    )
)

IN koşullarını  içermeyen  renklerin satışlarını hesaplamak gerekirse NOT ile formülü değiştirmek gerekiyor.

Siyah veya Mavi Olmayan Ürünler IN := 
CALCULATE (
    [Satışlar];
   NOT ('Ürünler'[Renk] IN {"Siyah" ; "Mavi" })
)


Burada "context" kavramını biraz daha açmak adına VALUES ile bir varyasyon yapalım;  VALUES ('Tablo'[SütunAdı])  bize, verdiğimiz sütunda tabular engine'nin gördüğü tekil değer listesini döndürür.

Matriste bulunduğumuz satırdaki rengin haricindeki diğer renklerin satışlarını hesaplayalım:

Diğer Renkler := 
CALCULATE(
    [Satışlar];
    NOT ('Ürünler'[Renk] IN VALUES('Ürünler'[Renk]))
)


Önce formülün nasıl çalıştığını anlamaya çalışalım: Tabular engine'nin -örneğin- matristeki "Yeşil" satırı için hesaplama yaparken gördüğü context'te rengi yeşil olan ürünler var. Yazdığımız kodun 4. satırındaki  'Ürünler'[Renk]  bu satır için  "Yeşil" .

 VALUES ('Ürünler'[Renk])  , bize internal açılımdaki FILTER ( ALL( )) yapısı sebebiyle  tüm tekil renkleri içeren tek sütunluk bir liste   döndürüyor.  NOT .. IN  diyerek de, bu satır için, yeşil hariç diğer tüm renklerin satışlarını hesaplamış oluyoruz.

Formül her renk için hesaplama yapıyorken, toplam (Total) satırı için bir şey döndürmüyor!

Aynı cümleleri toplam satırı için yürütelim: Tabular engine'nin toplam satırı için hesaplama yaparken gördüğü context'te şu an tüm renkler var. Dolayısıyla bu satır için 'Ürünler'[Renk]  tüm renkler . VALUES ('Ürünler'[Renk]) 'de tüm renkleri döndürüyor. NOT..IN dediğimizde her iki liste de aynı olduğundan elimizde boş küme kalıyor, yani hiç renk kalmıyor. Dolayısıyla tabular engine total satırı için hiçbir şey göremediğinden bir şey döndürmüyor.

Renk dilimleyiciden Kırmızı, Mavi ve Siyah'ı seçiyorum.


Total satırı için  context değişti!  [Diğer Renkler] metriğini hesaplamaya çalışırken tabular engine'nin gördüğü context'te bu sefer kırmızı, mavi ve siyah ürünler var. Yani 'Ürünler'[Renk] , kırmızı, mavi ve siyah oldu. VALUES ('Ürünler'[Renk]) -internal açılımdaki FILTER (ALL() sebebiyle- tüm tekil renkleri döndürmeye devam ediyor. İki renk listesi artık farklı olduğundan, bu sefer bir hesaplama yapabiliyor, çünkü kırmızı, mavi ve siyah haricindeki tüm renkleri satışlar tablosunda görüyor.

Blogun en sık tekrarladığım cümlesini bir kez daha tekrarlayacağım: DAX'ta her hücre, total satırındakiler de dahil olmak üzere, tek tek ve ilgili context altında hesaplanır.

DAX'ın fonksiyonel bir dil olması, aynı metrikleri farklı şekillerde de yazabilmeyi sağlıyor, bir şeyi hesaplamanın genellikle birden fazla yolu var, cümleyi nasıl kurduğumuza, kafamızın nasıl çalıştığına, fonksiyonlara alışmakla ilgili.

Aynı metriği şu şekilde de yazabiliriz:

Diğer Renkler EXCEPT := 
CALCULATE(
    [Satışlar];
    EXCEPT(
        ALL ('Ürünler'[Renk]) ; VALUES('Ürünler'[Renk])
    )
)


EXCEPT, verdiğimiz tablolar arasındaki farklılıkları bulan bir fonksiyon, ALL('Ürünler'[Renk]) tüm renklerin olduğu tek sütunluk tablo, VALUES('Ürünler'[Renk]) mevcut context'te görünen renk, her bir renk satırı için satırdaki renk neyse o, total satırı içinse kırmızı, mavi ve siyah.

DAX'ın bu fonksiyonelliğinin yaratıcılığı arttırdığı kesin, aynı sonuca farklı yollardan farklı fonksiyonlarla ulaşmaya çalışmak, DAX' ı ve tabular engine'i öğrenmek için son derece etkili bir yöntem. Bu yazının sonundaki örnekler gibi, DAX Man'in kurduğu cümleleri anlamaya çalışıp tecrübe etmek gerekiyor.

Son olarak, IN operatörü, CONTAINSROW fonksiyonunun "sugar syntax" 'ı.

Aynı formülü şu şekilde de yazabiliriz:

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

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, 5-6 Kasım
DAX ve Veri Modelleme, 12-13 Kasım