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.
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.
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.
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 ortalama | 710,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 gelir | 520,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 | Örnek | Soru |
|---|---|---|
Satislar | AVERAGEX(Satislar, …) | Satır başına |
VALUES(Satislar[SiparisNo]) | Sipariş başına ortalama tutar | Sipariş 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.
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.