ISINSCOPE ve Rasyolar , % of Parent

Daha önce ALL ve ALLSELECTED fonksiyonlarını kullanarak rasyolarla ilgili bir yazı yazmıştım.

Matristeki dip toplama göre % hesaplaması gayet kolay. Kolay olmayan, matriste birden fazla hiyerarşi olması durumunda, yüzdeyi her bir grup için kendi içinde ayrı ayrı hesaplamak. İdi.

Power BI 'ın Kasım güncellemesinde gelen ISINSCOPE fonksiyonu ile bu da kolaylaştı.

Örnek metriklere geçmeden önce, Analyze in Excel özelliği ile modele bağlandığımızda rasyolar için bir şeyler yazmaya bile gerek olmadığını hatırlatmak isterim. Aynı metriği birden fazla sayıda aynı matrise düşürdüğümüzde -sağ tıklayıp- "Show Values As" seçeneklerinden ilgili olanları seçmek yeterli.


Fakat aynı durumu Power BI raporlarında gösterebilmek için metriklerini yazmak gerekiyor.

Ekran görüntülerini basitleştirmek adına aşağıdaki veri setini kullanacağım:

Metriklerimizi ekleyelim:

Satışlar := SUM ('Satış'[Tutar])
Rasyo_Dip Toplama Göre := DIVIDE ([Satışlar] ; CALCULATE ([Satışlar] ; ALLSELECTED () ))

Hepsini matrise düşürdüğümüzde dilimleyicilerde  seçili filtrelere göre  yüzdeyi bulabiliyoruz.


Şimdiki amacımız dip toplama göre değil, her bir kategori içinde  her bir alt kategorinin payını bulmak . Bu hesaplama İngilizce olarak "Percent of Parent" diye adlandırılıyor. Yukarıdaki matrise göre -örneğin- Laptop alt kategorisi için Parent, Bilgisayarlar. Laptop da bu durumda "child" olarak isimlendiriliyor. Parent-Child ya da Parent-Member diye de geçiyor bu durum.

ISINSCOPE öncesinde bu durumu ISFILTERED ile çözüyorduk.

DAX konusunda en iyi kaynaklardan biri olan SQLBI 'da bu durumla ilgili çok önceden yazılmış bir yazı var. Okumanızı tavsiye ederim. O yazıda özetle matristeki satırda neyin olduğunu yakalamaya çalışıp, satırda Kategori varsa şu işlemi yap, Alt Kategori varsa bu işlemi yap tarzında bir yöntem. Problem ise rapor sayfasında dilimleyicilerden herhangi bir seçim yapılması durumunda hesabın  şaşmasıydı  ve bunun da çözümü anlatılıyor.

ISFILTERED ile ISINSCOPE birbirine benzemekle birlikte farklılaştıkları noktalar var. Aşağıdaki metrikleri modele ekliyorum:

Alt Kategori_ISFILTERED := ISFILTERED ('Satış'[Alt Kategori])
Alt Kategori_ISINSCOPE := ISINSCOPE ('Satış'[Alt Kategori])

Hepsini aşağıdaki gibi bir matrise düşürüyorum.


Dilimleyicide herhangi bir seçim yapılmadığında ikisi de aynı gibi gözüküyor. Fakat bir seçim yapıldığında aradaki fark ortaya çıkıyor.


ISFILTERED, verdiğimiz sütun üzerinde doğrudan bir filtre olup olmadığını kontrol ediyor, varsa TRUE dönüyor.

Dilimleyicide herhangi bir seçim yokken Kategori seviyesi ve total satırı için FALSE dönüyordu, alt kategorilerden seçimler yapıldığında ise TRUE döndü. Alt kategori ve kategori mevcut veri setimizde aynı tabloda. Dolayısıyla  alt kategoriye filtre koyduğumuzda kategori de otomatikman filtrelenmiş oluyor.

ISINSCOPE 'un tanımında şu yazıyor : "Returns true when the specified column is the level in a hierarchy of levels." Belirttiğimiz sütun hiyerarşi de gözüküyorsa TRUE döndürür desem -birebir çeviri olmasa da- yanlış sayılmaz.

Toplam satırlarını yakalamanın (total satırı, Bilgisayarlar ve Ev Aletleri satırları) daha esnek bir versiyonu gibi duruyor.

Hangi seviyede olduğumuzu yazdırabiliriz:

Hangi Seviyedeyiz := 
SWITCH ( TRUE ();
    ISINSCOPE ('Satış'[Alt Kategori]) ; "Alt Kategori";
    ISINSCOPE ('Satış'[Kategori]) ; "Kategori" 
)


Kategori satırındaysak satışları  seçili kategorilerin  satışlarına, alt kategorideysek satışları  seçili alt kategorilerin  satışlarına bölecek metriğimizi yazabiliriz artık.

% of Parent := 
SWITCH ( TRUE() ;
    ISINSCOPE ('Satış'[Alt Kategori]); 
        DIVIDE ([Satışlar] ; CALCULATE ([Satışlar] ; ALLSELECTED ('Satış'[Alt Kategori]))
        );
    ISINSCOPE ('Satış'[Kategori]) ; 
        DIVIDE ([Satışlar] ; CALCULATE ([Satışlar] ; ALLSELECTED ('Satış'[Kategori]))
        )
)

İlk yazdığımız rasyoyla birlikte matrise düşürdüğümüzde hep dip toplama göre hem de satırdaki hiyerarşiye göre rasyoları hesaplamış oluyoruz.

Toplam satırı için bir şey göstermemesi normal, burada bir seviye yok, bu kozmetik durumu metriğimizi modifiye ederek çözebiliriz.

% of Parent := 
SWITCH ( TRUE() ;
    ISINSCOPE ('Satış'[Alt Kategori]); 
        DIVIDE ([Satışlar] ; CALCULATE ([Satışlar] ; ALLSELECTED ('Satış'[Alt Kategori]))
        );
    ISINSCOPE ('Satış'[Kategori]) ; 
        DIVIDE ([Satışlar] ; CALCULATE ([Satışlar] ; ALLSELECTED ('Satış'[Kategori]))
        )
    ; 1
)

Hiç bir koşula uymuyorsa, yani en dip toplam satırındaysak 1 göster demiş olduk. SWITCH yazısı için buradan.


Bu arada matrislere aynen Excel pivotlarda olduğu gibi +- ikonları geldi geçen ay, artık bir anda tüm seviyeleri açmak veya kapatmak gerekmiyor. Kullanmak isterseniz, matrisin format ayarlarından "Row Headers" bölümündeki özelliği açmalısınız.


Yazıdaki modeli indirebilirsiniz.

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

Yorum yapın