Ana içeriğe geç
Kesit Power BI
Orta · DAX Kalıpları

Sıralama ve ilk N: RANKX ve TOPN

Ürünleri sıralamak, ilk 5'in toplamını almak, eşitliklerle başa çıkmak.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

RANKX

Ürün Sırası = RANKX(ALL(Urunler[Urun]), [Net Satış])

RANKX(tablo, ifade) tablodaki her satır için ifadeyi hesaplar, sonra geçerli bağlamdaki değerin bu listede kaçıncı olduğunu bulur. ALL burada şarttır: görselin satır filtresi kalırsa tabloda tek ürün kalır ve her ürün 1. olur.

İsteğe bağlı bağımsız değişkenler: RANKX(tablo, ifade, , ASC) küçükten büyüğe; son bağımsız değişken DENSE olursa eşitliklerden sonra numara atlanmaz: iki ürün 1. ise sıradaki 3. değil 2. olur.

Toplam satırıToplam satırında da RANKX çalışır ve anlamsız bir “1” üretir. IF(HASONEVALUE(Urunler[Urun]), RANKX(...)) ya da ISINSCOPE ile yalnızca ürün düzeyinde göster.

TOPN

İlk 5 Ürün Satışı =
CALCULATE([Net Satış], TOPN(5, ALL(Urunler[Urun]), [Net Satış]))

TOPN(n, tablo, sıralamaİfadesi) en yüksek n satırı tablo olarak döndürür. CALCULATE içinde filtre olarak kullanılınca “yalnızca bu ürünler” anlamına gelir.

Görselde ilk N

Kod yazmadan da yapılabilir: Filtreler bölmesinde ürün alanını seç → Filtre türü: İlk N → 5 → Değere göre: Net Satış. Ama ölçüyle yapılan ilk N, kart ve KPI gibi her görselde kullanılabilir.

Eşitlikler ve sıralama türleri

Net satışRANKX (varsayılan, SKIP)RANKX(..., DENSE)
90011
70022
70022
50043

Yarışma sıralaması için SKIP, “kaçıncı fiyat düzeyi” gibi sorular için DENSE kullanılır. Yeni RANK fonksiyonu (pencere fonksiyonları ailesi) eşitliği ikinci bir sıralama sütunuyla bozabilir: RANK(ALL(Urunler[Urun]), ORDERBY([Net Satış], DESC, Urunler[Urun], ASC)).

Seçime göre sıra: ALLSELECTED

Seçimdeki Sıra =
IF(
    HASONEVALUE(Urunler[Urun]),
    RANKX(ALLSELECTED(Urunler[Urun]), [Net Satış])
)

ALL tüm ürünler arasındaki sırayı verir; dilimleyicide yalnızca Elektronik seçiliyse bile “Kulaklık 7. sırada” der. ALLSELECTED ise yalnızca seçili ürünler arasında sıralar: Elektronik içinde 2. Hangisinin doğru olduğu soruya bağlıdır; başlıkta hangisini gösterdiğini yaz.

Kategori içinde sıra

Kategori İçi Sıra =
IF(
    HASONEVALUE(Urunler[Urun]),
    RANKX(ALLEXCEPT(Urunler, Urunler[Kategori]), [Net Satış])
)

ALLEXCEPT ürün filtresini kaldırır ama kategori filtresini korur: her ürün kendi kategorisindeki diğer ürünlerle yarışır.

Uzmanlaş

Bağlar: kim beşinci?

Satış ekibi “sipariş sayısına göre ilk 5 ürün” listesini prim hesabında kullanacak. Liste beşinci sırada bir bağla karşılaşıyor:

Ürün[Sipariş Sayısı]RANKX (varsayılan, SKIP)RANKX (DENSE)Bağ bozmalı
Nemlendirici Krem55555
Dudak Balmı55556
Yün Atkı54767
İstatistiğe Giriş53878
Basic Tişört53879
Suç ve Ceza538710

“İlk 5” filtresi SKIP sıralamasıyla 6 ürün döndürür (iki tane 5.), DENSE ile ise 9 ürün (7. sıraya kadar 6 sıra numarası var). İş kuralı bir bağ bozucu ister: “Eşitlikte cirosu yüksek olan önde.” RANKX’te bunun en sade yolu, ikinci ölçüyü ilk ölçüye küçük bir ağırlıkla eklemektir:

Bağ Bozmalı Sıra =
IF(
    HASONEVALUE(Urunler[Urun]),
    RANKX(ALL(Urunler[Urun]), [Sipariş Sayısı] * 1000000 + [Net Satış])
)

Çarpan, ikinci ölçünün alabileceği en büyük değerden büyük olmalı. Bu modelde bir ürünün net satışı 102.000 ₺’yi geçmiyor, 1.000.000 güvenli. Çarpan küçük kalırsa ciro sipariş farkını ezer ve sıra bozulur. Okunurluk istiyorsan Pencere fonksiyonları dersindeki RANK + ORDERBY kalıbı aynı işi açıkça yapar.

Satışı olmayanlar da sıralanır

40 üründen 2’si (Koşu Bandı ve Gurme Lokum Kutusu) hiç satmamış. RANKX ikisine de 39 verir; tabloda “39. sırada” iki ürün görünür. Çoğu raporda bu satırlar gizlenmeli:

Satışlı Ürün Sırası =
IF(NOT ISBLANK([Net Satış]), RANKX(ALL(Urunler[Urun]), [Net Satış]))

TOPN dış bağlamda değerlendirilir

Temel bölümdeki İlk 5 Ürün Satışı ölçüsü tüm şirkette 315.381 ₺ verir. Aynı ölçüyü kategori satırlarına koyunca ne olur? TOPN’in içindeki [Net Satış], kategori filtresi altında hesaplanır. Başka kategorilerin ürünleri o hücrede BLANK değer alır. Sonuçta TOPN o kategorinin ilk 5 ürününü seçer. Elektronik satırında “Elektronik’in ilk 5’i” görürsün, “şirketin ilk 5’inden Elektronik’e düşenler” değil.

İlk 5 Dışı Satış =
[Net Satış] - CALCULATE([Net Satış], TOPN(5, ALL(Urunler[Urun]), [Net Satış]))

Bu ölçü Elektronik’te 68.487 ₺ verir, Hediye, Kozmetik ve Spor’da 0. Bu üç kategoride satışı olan ürün sayısı zaten 5 ya da daha az. Hangisini istediğini bil: kategori içi ilk N ise bu davranış doğru; şirketin ilk N’i ise listeyi kategori filtresi kaldırılmış bir bağlamda hesaplamalısın.

Top N + Diğer

Yönetim kurulu sunumunda 40 çubuklu grafik yerine “ilk 5 ürün + Diğer” isteniyor. Sorun: Diğer bir ürün değil, ürün ekseninde böyle bir değer yok. Çözümün iki parçası var:

  1. Eksen tablosu: UrunlerVeDiger, 40 ürün adına bir “Diğer” satırı eklenmiş 41 satırlık bağlantısız bir tablo. Grafiğin eksenine bu tablonun Urun sütunu konur.
  2. Ölçü: hazır [Satış (Top N + Diğer)] ölçüsü her eksen değeri için karar verir. Değer ilk N’deyse o ürünün satışını, “Diğer” ise genel toplam eksi ilk N toplamını döndürür, kalan ürünler için BLANK döndürür ve çubuk görünmez.

N = 5 iken grafik şöyle görünür: 27" Monitör 101.986 ₺, Akıllı Saat 61.757 ₺, Türk Kahvesi Makinesi 53.963 ₺, Robot Süpürge 49.494 ₺, Kamp Çadırı 48.181 ₺ ve Diğer 935.391 ₺. Sağlama: ilk 5’in toplamı 315.381 ₺ + Diğer 935.391 ₺ = 1.250.772 ₺, yani [Net Satış]’ın tamamı. Grafik hiçbir satışı kaybetmez.

Dinamik N

TopNSecim tablosu 3’ten 15’e kadar N değerlerini tutar. Bu tabloyu bir dilimleyiciye koyarsın, ölçü SELECTEDVALUE(TopNSecim[N], 5) ile seçimi okur; seçim yoksa 5 kullanır. Kullanıcı 10 seçerse Diğer 727.113 ₺’ye iner.

Sıralama tuzağıGrafiği değere göre azalan sıralarsan “Diğer” en büyük çubuk olur ve en başa geçer. Çözüm: Diğer için büyük bir sıra numarası döndüren bir yardımcı sıra ölçüsü yazıp araç ipucu (Tooltip) alanına eklemek ve grafiği o alana göre sıralamak.
Üretim notu: RANKX’in maliyetiRANKX her hücrede, sıralama tablosundaki her satır için ölçüyü yeniden hesaplar. 40 ürünlük bir tabloda bu 40 × 40 = 1.600 hesaptır ve fark edilmez. 20.000 müşterilik bir tabloda ise yüz milyonlarca hesaba çıkar. Büyük boyutlarda sıralama tablosunu daralt (ALLSELECTED, ya da yalnızca satışı olanlar), sıra numarasını görselde değil yalnızca gereken sayfada kullan ve süreyi Performans Analizi (Performance analyzer) ile ölç.
Alıştırmalara geç (8)