Hesaplanmış Sütun Olarak RANKX

Daha önce RANKX'in metrik olarak kullanımına ilişkin üç farklı yazı eklemiştim, 1, 2, 3, bu sefer de hesaplanmış sütun olarak kullanımına ilişkin örnekler vereceğim. Çünkü bu fonksiyon filter context, row context ve hesaplanmış sütun kavramlarının çalışma mantığını anlamak açısından çok güzel bir örnek. Ve DAX tamamen bu konseptler üzerinde dönüyor.

Metrik olarak kullanımı kısaca özetlemek gerekirse: Aşağıdaki gibi kategorileri satış büyüklüklerine göre sıralayan 3  metriğimiz  var.

Satışlar = SUM( 'Satışlar'[Miktar] )
Kategori Sıralaması HATALI := RANKX( 'Ürün Kategorileri';[Satışlar] )
Kategori Sıralaması DOĞRU := RANKX( ALLSELECTED( 'Ürün Kategorileri') ; [Satışlar] )

HATALI metrik,  filter context'inde sadece kendisini gördüğü için  hatalıydı, diğer kategorileri de görebiliyor olması için ALLSELECTED (veya ALL) ile birlikte kullanılmalı demiştim.

Hatalı ve doğru çalışan metriklerin  gördüğü değerleri  bulmak için de aşağıdaki gibi iki formül kullanmıştım.

HATALI Metrik Neyi Görüyor := CONCATENATEX( 'Ürün Kategorileri' ; [Satışlar] ; "-")
DOĞRU Metrik Neyi Görüyor := CONCATENATEX( ALLSELECTED('Ürün Kategorileri') ; [Satışlar] ; "-")


Doğru çalışan metriğin Total satırında 1 göstermesinin sebebinin, satırdaki değerlerle birlikte toplam değerini de (43.625) karşılaştırması olduğunu söylemiş, ama Total satırı için sıralama göstermenin çok anlamlı olmadığından bahsedip formülü modifiye etmiştim.

Kategori Sıralaması DOĞRU Modifiye := 
IF( HASONEVALUE('Ürün Kategorileri'[Kategori] ) ;
    RANKX ( ALLSELECTED('Ürün Kategorileri') ; [Satışlar] )
)


Aynı şeyi bu sefer metrik yerine  hesaplanmış sütun olarak  yapmaya çalışalım: Ürün Kategorileri tablosuna aşağıdaki formülleri birer hesaplanmış sütun olarak ekliyorum.

Kategori Satışları = [Satışlar]
Kategori Sıralaması = RANKX( 'Ürün Kategorileri' ; [Satışlar] )
Neyi Görüyor = CONCATENATEX( 'Ürün Kategorileri' ; [Satışlar] ; "-" )


** Hesaplanmış sütun formülü olarak sadece [Satışlar] dediğimizde nasıl çalışıyor sorusu için Context Transition yazısına göz atmak isteyebilirsiniz.

Metrik olarak yazdığımızda her kategori için 1 göstererek hatalı çalışan formül, bir hesaplanmış sütun olarak tabloya eklendiğinde doğru çalışıyor!

Burada hesaplanmış sütun kavramı ve RANKX'in bir iterator olması devreye giriyor.

Hesaplanmış sütun: sütun olarak formüle ne yazdıysak,  tablodaki her bir satır için tek tek çalışacak . Yani yukarıdaki sıralama formülü, formüle ne yazdığımızdan henüz bağımsız olarak, 8 kez çalışacak. Her bir kategori satırı için!

Formüle yazdığımız  RANKX bir iterator , yani satır bazlı çalışan bir fonksiyon. Kendisine iterate etmesi için hangi tabloyu verdiysek,  o tabloda gördüğü tüm satırlar için tek tek çalışacak . RANKX'e verdiğimiz tablo da Ürün Kategorileri tablosu.

Hem hesaplanmış sütun hem de iterator'lar , row context yaratan kavramlar. Yani gördükleri tablonun her bir satırı için çalışacaklar.

Yukarıdaki durumda  içiçe çalışan iki tane row context var , ilkini (dıştakini) hesaplanmış sütun yaratıyor, ikincisini (içtekini) RANKX'in bir iterator olması yaratıyor.

Hesaplanmış sütünun yarattığı row context -diyelim- "Cep Telefonları" için çalıştığında, içteki RANKXin yarattığı row context Ürün Kategorileri tablosunun her bir satırı için çalışacak. "Cep Telefonları" için RANKX tüm tabloyu tarayacak ve sonra değerleri sıralayacak.

Aynı işlemi hesaplanmış sütunun yarattığı row context "Ev Aletleri" için yaptığında, RANKX bir kez daha tablonun tüm satırlarını tarayacak.

Yani yukarıdaki işlemde 8 x 8 = 64 kez iterasyon var!

Programlama dillerine aşina olanlar bu bir i= 1 to 5 j=1 to 10 gibi bir şey. İçiçe döngüye sokuyoruz.

Metrik olarak hatalı çalışan formülün, hesaplanmış sütun olarak yazıldığında doğru çalışmasının gerekçesi bu: İçiçe çalışan row context'ler.

Row context'i, özellikle yukarıdaki gibi içiçe çalışanları anlamak için daha önce yazdığım EARLIER  yazısına da göz atmanızı önereceğim.

Son olarak, EARLIER yazısında da örneklediğim gibi, RANKX olmadan da sıralama yapmak mümkün.

Sıralama_COUNTROWS = 
VAR SatirdakiKategorininSatislari = 'Ürün Kategorileri'[Kategori Satışları]
RETURN
    COUNTROWS(
        FILTER( 'Ürün Kategorileri' ;
            'Ürün Kategorileri'[Kategori Satışları] > SatirdakiKategorininSatislari
        )
    ) + 1


Yazıdaki modeli indirebilirsiniz.

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