Ana içeriğe geç
Kesit Power BI
Orta · DAX Bağlamları

Yineleyiciler (iterators): SUMX, AVERAGEX ve RELATED

Satır satır hesap yapıp sonucu toplamak; ilişkili tablodan değer çekmek.

Uygulamada aç, 9 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ç.

X ile biten fonksiyonlar

SUMX, AVERAGEX, MINX, MAXX, COUNTX, CONCATENATEX aynı kalıbı izler:

SUMX( <tablo>, <her satır için hesaplanacak ifade> )

Tabloyu satır satır dolaşır (satır bağlamı), ifadeyi her satırda hesaplar, sonra toplar ya da ortalamasını alır.

RELATED: boyuttan değer getirmek

Satış satırında ürünün liste fiyatı yok, ama Urunler tablosunda var. İlişkinin “bir” tarafındaki değeri satır bağlamında okumak için RELATED kullanılır:

Liste Fiyatından Ciro = SUMX(Satislar, Satislar[Adet] * RELATED(Urunler[Fiyat]))

Ters yön (bir ürünün tüm satışları) için RELATEDTABLE vardır: COUNTROWS(RELATEDTABLE(Satislar)) bir ürün satırında o ürünün satış satırı sayısını verir.

SUM mı SUMX mi?

SUM(Satislar[Tutar]) aslında SUMX(Satislar, Satislar[Tutar])'ın kısaltmasıdır. Toplanacak şey hazır bir sütunsa SUM; satır başına bir hesap gerekiyorsa SUMX.

Hesaplanmış sütun yerine SUMX“Satır başına kâr” için Satislar'a sütun eklemek yerine SUMX içinde hesaplamak çoğu zaman daha iyidir: model küçük kalır, hesap yalnızca gerektiğinde yapılır.

Ortalamanın iki anlamı

Satır Ortalaması = AVERAGE(Satislar[Tutar])
Sipariş Ortalaması = AVERAGEX(VALUES(Satislar[SiparisNo]), CALCULATE(SUM(Satislar[Tutar])))

İlki sipariş satırı başına, ikincisi sipariş başına ortalamadır. VALUES, görünür sipariş numaralarının listesini verir; AVERAGEX bu liste üzerinde dolaşır. İçerideki CALCULATE'in görevi bir sonraki ileri derste (bağlam geçişi) açıklanıyor.

Derinleş

Ortalamaların ortalaması tuzağı

“Kategorilerin ortalama sepeti” ile “ortalama sepet” aynı şey değildir:

Kategori Ortalaması =
AVERAGEX(VALUES(Urunler[Kategori]), [Ortalama Sepet])

Bu modelde [Ortalama Sepet] 1.493 ₺, kategori ortalamalarının ortalaması ise 893 ₺. AVERAGEX her kategoriye eşit ağırlık verir: 20 siparişlik bir kategori ile 300 siparişlik bir kategori ortalamayı aynı ölçüde etkiler. Bir sipariş birden çok kategoriden ürün içerdiğinde, kategori düzeyinde siparişler parçalandığı için ortalama daha da düşer.

Kural: ortalamayı her zaman pay ve paydanın oranı olarak hesapla (DIVIDE([Net Satış], [Sipariş Sayısı])). AVERAGEX’i yalnızca soru gerçekten “grupların ortalaması” olduğunda kullan, ör. “bir mağazanın ortalama aylık cirosu”.

Bir iteratör kaç kez hesaplar?

SUMX(Satislar, ...) her satırda ifadeyi bir kez hesaplar. İfade bir ölçü ise her satırda bağlam geçişi de olur. Satır sayısı arttıkça bu maliyet büyür; eşiği modelin ve ifadenin belirler, Performans Analizi ile ölç. Aynı sonucu daha az satır üzerinde döndürebilirsen (ör. VALUES(Urunler[Urun]) üzerinde) her zaman tercih et.

Uzmanlaş

Ağırlıklı ortalama: neyin ortalaması?

Fiyatlama ekibi soruyor: “Ortalama satış fiyatımız ne kadar?” Bu soruya üç farklı ve üçü de savunulabilir cevap var. Hangisini verdiğini bilmezsen toplantıda üç farklı sayı dolaşır.

Basit Ortalama Fiyat =
CALCULATE(AVERAGE(Satislar[BirimFiyat]), Satislar[Durum] <> "İptal")

Adet Ağırlıklı Fiyat =
CALCULATE(
    DIVIDE(SUMX(Satislar, Satislar[Adet] * Satislar[BirimFiyat]), SUM(Satislar[Adet])),
    Satislar[Durum] <> "İptal"
)

İndirimli Birim Gelir = DIVIDE([Net Satış], [Satılan Adet])
ÖlçüSonuçCevapladığı soru
Basit ortalama710,16 ₺“Ortalama bir satış satırındaki fiyat ne?” Her satır bir oy.
Adet ağırlıklı537,83 ₺“Sattığımız ortalama bir ürünün liste fiyatı ne?” Her adet bir oy.
İndirimli birim gelir520,72 ₺“Bir adetten ortalama ne kazanıyoruz?” İndirim de hesapta.

Basit ortalama en yüksek çıkıyor, çünkü pahalı ürünler genellikle tek adet satılıyor; ucuz kitaplar ise satır başına daha çok adetle. Basit ortalama her satırı eşit saydığı için pahalı satırlar ortalamayı yukarı çeker. Ağırlıklı ortalamanın genel kalıbı her zaman aynıdır:

Ağırlıklı Ortalama =
DIVIDE(SUMX(Tablo, Ağırlık * Değer), SUMX(Tablo, Ağırlık))

İndirimde de durum benzer. AVERAGE(Satislar[Indirim]) tüm satırlar için %3,25 verir; brüt tutarla ağırlıklandırılmış indirim oranı %3,15’tir. Kategori düzeyinde fark büyür: Ev & Yaşam’da satır ortalaması %3,81 iken ciro ağırlıklı oran %4,19. Bu kategoride indirim büyük tutarlı satışlarda yoğunlaşıyor. Satır ortalamasına bakan biri bunu kaçırır.

Hangi tabloyu dolaşıyorsun?

Bir yineleyicinin ilk bağımsız değişkeni, sorunun tanecik (grain) düzeyidir. Aynı ifade farklı tablolar üzerinde farklı sorulara cevap verir:

Dolaşılan tabloÖrnekSoru
SatislarAVERAGEX(Satislar, …)Satır başına
VALUES(Satislar[SiparisNo])Sipariş başına ortalama tutarSipariş başına
VALUES(Tarih[YilAy])MAXX(VALUES(Tarih[YilAy]), [Net Satış])En iyi ay: 94.001 ₺ (Aralık 2024)
VALUES(Kategoriler[Kategori])Kategorilerin ortalamasıKategori başına

Boş aylar tuzağı

“Aylık ortalama satışımız ne?” sorusunu AVERAGEX(VALUES(Tarih[YilAy]), [Net Satış]) ile cevaplarsın. Ama AVERAGEX BLANK sonuçları atlar. Bu modelde satışlar Haziran 2022’de başlıyor; 2022’de satış olan yalnızca 7 ay var.

Satışlı Ay Ortalaması =
AVERAGEX(VALUES(Tarih[YilAy]), [Net Satış])

Takvim Ayı Ortalaması =
AVERAGEX(VALUES(Tarih[YilAy]), [Net Satış] + 0)

2022 satırında ilk ölçü 14.691 ₺ (7 aya bölünür), ikincisi 8.570 ₺ (12 aya bölünür) verir. Tüm dönemde 40.347 ₺’ye karşı 34.744 ₺. Hangisi doğru? “Faaliyet gösterdiğimiz aylarda ortalama” sorusu için ilki, “yıllık bütçeyi 12’ye böl” sorusu için ikincisi. + 0 hilesini dikkatli kullan: verinin henüz gelmediği gelecek ayları da sıfır sayar.

Yineleyicide çıplak toplayıcı tuzağı

Yineleyicinin içinde ölçü yerine doğrudan AVERAGE ya da SUM yazarsan, satır bağlamı ilişki üzerinden süzmez:

EVALUATE
ADDCOLUMNS(
    VALUES(Kategoriler[Kategori]),
    "Çıplak", AVERAGE(Satislar[BirimFiyat]),
    "CALCULATE ile", CALCULATE(AVERAGE(Satislar[BirimFiyat]))
)

“Çıplak” sütunu her kategoride 704,80 ₺ gösterir: tüm satırların ortalaması. “CALCULATE ile” sütunu ise Elektronik’te 1.462 ₺, Kitap’ta 218,80 ₺ verir. Bu hatayı fark etmenin en kolay yolu sütundaki değerlerin hepsinin aynı olmasıdır. Ölçü referansı kullanırsan ([Ortalama Birim Fiyat]) CALCULATE otomatik eklenir.

Kontrol listesi: yineleyici yazarken1) Sorunun tanecik düzeyi ne: satır, sipariş, müşteri, ay? İlk bağımsız değişken o olsun. 2) Ortalama mı istiyorsun, ağırlıklı ortalama mı? Ağırlığı açıkça yaz. 3) BLANK değerler atlansın mı, sıfır mı sayılsın? 4) İçerideki ifade ölçü değilse CALCULATE gerekiyor mu? 5) Dolaşılan tablo gereğinden büyük mü? 1.620 satır yerine 7 kategori dolaşmak çok daha ucuzdur.
Alıştırmalara geç (9)