RANKX ile En yüksek N, En düşük N

Önceki yazıdan hareketle, raporlara bakarken bazen en büyük veya en küçük 10-20 X'i görmek isteriz: X bazen müşteridir, bazen üründür, bazen satış ekibidir.

Öncelikle modele kullanıcının en yüksek veya en düşük seçimleri yapabilmesi için bir tablo ekliyorum: Bunu yapmak için de  Home  tabındayken  Enter Data  butonunu tıklıyorum ve karşımıza çıkan tabloyu ihtiyaca uygun şekilde doldurup Load diyorum.

Modele "elle" manuel tablo eklemenin en hızlı yolu bu. Yeni bir tablo oluşuyor.


Girdiğiniz değerleri sonradan değiştirmek isterseniz Power Query tarafında bunu yapabilirsiniz: Source (kaynak) stepindeki ikonu kullanabiliriz.

Tabloda "Hepsi" karşılığı için çok yüksek bir değer giriyorum ki her şeyi görebilelim.

İkinci bir tabloyu da en yüksek en düşük seçimi için ekliyorum. Windows 10'da emoji desteği var, değer girmeden önce Windows +. kombinasyonu kullanırsanız emojileri görebilirsiniz!


Ürünleri satış büyüklüğüne göre sıralayacak metriği yazıp matrise düşürüyorum, aynı zamanda seçim için eklediğimiz tablolardaki sütunları da birer dilimleyici olarak ekliyorum.

Ürünlerin Satışlara Göre Sırası := 
IF( HASONEFILTER ('Ürünler'[Ürün Kodu]) ;
    RANKX ( ALLSELECTED ('Ürünler') ; [Satışlar] )
)


Kullanıcının dilimleyicide seçtiği değerleri bulmak için daha önce örneğini yaptığımız SELECTEDVALUE fonksiyonunu da kullanabiliriz ama başka bir örnek yapalım, VALUES  fonksiyonuna da yeni bir örnek olsun.

Yüksek Düşük Seçimi := 
IF ( HASONEFILTER ('Yüksek-Düşük'[En Yüksek - En Düşük] );
    VALUES('Yüksek-Düşük'[En Yüksek - En Düşük]);
    "👍"
)

Yazdığımız kod, eğer dilimleyicide bir seçim yapıldıysa VALUES (….) kısmıyla bunu yakalayacak, eğer bir seçim yapılmadıysa veya birden fazla seçim yapıldıysa en yükseğe göre çalışacak.

Diğer seçimi yakalamak için de benzer bir kod yazalım:

Değer Seçimi := 
IF ( HASONEFILTER ('TopBottomSeçim'[Değer]) ;
    VALUES ('TopBottomSeçim'[Değer]) ;
    MAX ('TopBottomSeçim'[Değer])
)

Bu kod da benzer mantıkta çalışacak, bir seçim yapıldıysa bunun değerini yakalayacak, yapılmadıysa gördüğü maximum değeri kullanacak. MAX tıpkı SUM gibi bir aggregator fonksiyon, bir sütun verdiğimizde mevcut context altında bu sütunda gördüğü değerlerden maksimumunu buluyor.

Yazdığımız metriklerin doğruluğunu kontrol etmek için her iki metriği de "card" görseline düşürebiliriz.


Dilimleyicide yapılan seçimlere göre çalışacak şekilde sıralama metriğimizi modifiye etmemiz lazım. Bunu da yapmanın en kolay yollarından biri değişken yapısını kullanmak.

Sıralama Modifiye := 
IF ( HASONEFILTER ('Ürünler'[Ürün Kodu]) ;
    VAR YuksekDusukSEcimi = [Yüksek Düşük Seçimi]
    RETURN
        SWITCH (TRUE();
        YuksekDusukSEcimi= "👍"; RANKX ( ALLSELECTED ('Ürünler') ; [Satışlar] ) ;
        YuksekDusukSEcimi= "👎"; RANKX ( ALLSELECTED ('Ürünler') ; [Satışlar] ; ; ASC)
        )
)

* SWITCH  ile ilgili örneklere göz atmak isterseniz buradan ve buradan.

RANKX'in  varsayılan sıralama şekli  büyükten küçüğe olduğu için ekstradan belirtmeye gerek yok ama küçükten büyüğe yapmak için opsiyonel parametrelerden sıralama şeklini belirleyen parametreyi ASC olarak yazdım. RANKX'in yazım şeklinin opsiyonel parametrelerle birlikte aşağıdaki gibi olduğunu tekrar hatırlatayım.

RANKX ( tablo ; deyim ; değer ; sıralama şekli ; eşitlik durumunda sıralama nasıl olacak )

Yazdığımız kodda "değer" parametresini pas geçmek için boş bıraktığımıza dikkatinizi çekerim.

Her iki metriği de matrise düşürdüğümüzde modifiye olanın en yüksek-en düşük seçimine tepki verdiğini görebiliriz.


Yaptığımız seçime göre sadece en yüksek veya en düşük satışları gösterecek metriğimizi yazalım:

En Yüksek En Düşük N := 
IF ([Sıralama Modifiye] <= [Değer Seçimi] ; [Satışlar])

ve matrise düşürelim.

Yaptığımız seçime göre matrise en düşük 10 ürünün satışları geldi ama bir sorun var: Toplam Satırı Toplamı Göstermiyor ! Sadece en düşük 10 ürünün satışlarını değil tüm ürünlerin satışını gösteriyor!

Aynı yazıdaki tekniği kullanarak sadece 10 ürünün değerini toplamasını sağlayabiliriz.

En Yüksek En Düşük N Ürün Satışları := 
IF ( HASONEVALUE ('Ürünler'[Ürün Kodu]);
    [En Yüksek En Düşük N];
    SUMX ( VALUES ('Ürünler') ; [En Yüksek En Düşük N])
)


RANKX'in context kavramlarını anlatmak için çok güzel bir fonksiyon olduğunu yazarken farkettim! Aynı zamanda biraz komplike bir fonksiyon. Bir kaç yazıyla daha örneklendireceğim.

Yazıdaki modeli indirebilirsiniz.

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