CALCULATE Fonksiyonuna Giriş

Bu yazı Power BI ve DAX'taki en önemli fonksiyonlardan biri olan CALCULATE 'e giriş yazısı. CALCULATE fonksiyonunun yaptığı birden fazla iş var: Bunlardan biri mevcut "context" i değiştirmek.

** "Context", DAX'taki en önemli kavramlardan biri, bu yazıya ve yazı içinde linkini verdiğim diğer yazılara göz atmanızı tavsiye ederim. CALCULATE ile ilgili birkaç yazıdan sonra context kavramıyla ilgili hepsini birleştiren ayrı bir yazı yazacağım muhtemelen.

Diğer çoğu yazıda olduğu gibi Contoso veritabanının kısmen Türkçeleştirilmiş halini kullanacağım, tablolar arası ilişkiler aşağıdaki gibi:

Fonksiyonun yazım şekli şöyle :

Metrik := CALCULATE ( Hesaplanacak deyim; Condition 1; Condition 2 ; ...; Condition N )

Satışları hesaplayan basit bir metrikle birlikte, siyah ürünlerin satışını hesaplayan, CALCULATE ile yazılmış bir başka metrik daha yazalım ve her ikisini de bir matrise düşürelim.

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

CALCULATE fonksiyonu, "condition" 'da belirttiğiniz sütun üzerindeki TÜM filtreleri kaldırır ve bu sütun üzerinde kendi context'ini yaratır. Yazdığımız örnekteki  'Ürünler'[Renk] = "Siyah"  parametresi, veri modelindeki tablolar arası ilişkilerden gelen doğal filter context'i matristeki hiçbir renk satırı için umursamadı, kaldırdı ve  'Ürünler'[Renk]  sütunu üzerine kendi filtresini, yani "Siyah" filtresini ekledi.

[Satışlar] metriği her bir renk için ilgili rengin satışlarını gösterirken, [Siyah Ürünlerin Satışı] metriği  toplam satırı da dahil olmak üzere  tüm renkler için aynı rakamı gösteriyor.

Resimdeki "Renk" slicer'ından bazı renkleri filtreliyorum, buna "Siyah" da dahil.

Rakam değişmedi, matriste "Siyah" satırı gözükmemesine ve slicer'dan "Siyah" rengi filtrelemiş olmamıza rağmen, yazdığımız metrik siyah renkli ürünleri görüyor ve bunların satışını hesaplıyor. Slicer'da yaptığımız seçimler matristeki Renk sütununu etkiliyor, [Satışlar] metriğini etkiliyor ama [Siyah Ürünlerin Satışı] metriği hep aynı.

Yazdığımız metriğin arka planda çalışan  uzun formülü  aslında şöyle:

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

Bu arka plandaki "internal" çevrimde bulunan  FILTER ( ALL ('Ürünler'[Renk])  ile tabular engine önce renk sütunundaki tüm filtreleri kaldırdı sonra kendi context'ini ekledi: "Siyah ürünlerin satışlarını hesaplayacağım".

Formüldeki condition, sadece 'Ürünler'[Renk] sütunu üzerindeki filter context'i modifiye ediyor, matrise başka bir sütunu -örneğin Kategorileri- düşürürsek,  ilgili kategorideki siyah renkli ürünlerin satışını  hesaplayacaktır. Yani başka bir sütundan gelen filtrelere riayet edecektir.

İlk matristeki Renk altına Kategoriler sütununu getirelim ve son matrisle birlikte gösterelim:

Sağdaki matriste, [Siyah Ürünlerin Satışı] metriği satırdaki renk değişse de, her bir kategori için aynı rakamları gösteriyor.  Hesaplama yaparken Renk sütunundaki filtreleri umursamıyor çünkü. Dolayısıyla renk değişse bile hesapladığı şey, her bir kategorideki siyah ürünlerin satışı. Bu rakamlar da soldaki matrisle aynı. (Resim karmaşık hale gelmesin diye sadece birkaç ok çizdim.)

Soldaki matriste Kategoriler'in altına Renk'leri getiriyorum, slicer seçimlerine de Siyah rengi ekliyorum:

[Siyah Ürünlerin Satışı] metriği her iki matriste de her bir hücre için ayrı ayrı hesaplama yaparken, Renk sütununa filtre koyan hiçbir şeyi umursamıyor, Renk sütununda kendi context'ini yaratıyor, geri kalan tüm sütunlardan gelen filtrelere riayet ediyor.

Bu giriş yazısı demiştim, gerisi gelecek, fakat ufak bir not daha unutmadan düşelim: Bir metriği CALCULATE altında adıyla doğrudan çağırmakla, ilgili metriğin formülünü sıfırdan tekrar yazmak arasında fark vardır,   her zaman aynı sonucu vermeyebilir . CALCULATE'in hangi context altında çalıştığı önemlidir.

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

Yazıdaki modeli indirebilirsiniz.

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