- SUM ile SUMX arasındaki temel fark
- İteratör fonksiyon ailesi
- Satır bağlamı ve bağlam geçişi
- Toplam satırı tuzağı: neden toplamlar tutmuyor?
- Filtrelenmiş tabloyla iteratör: FILTER ve koşullar
- Örnek senaryo: ortalama sipariş değeri ve ağırlıklı ortalama
- Kontrol listesi ve sık hatalar
- Bu beceriyi Mindset programlarında nerede çalışırsınız
- Sık sorulan sorular
SUMX ve iteratör fonksiyonlar: DAX'ta satır satır hesaplama
SUM ile SUMX farkı, satır satır hesaplama, AVERAGEX ve MAXX kullanımı, toplam satırı tuzağı ve performans için dikkat edilecekler örneklerle anlatılıyor.
SUM ile SUMX arasındaki temel fark
SUM tek bir sütunu toplar. Örneğin SUM(Satışlar[Tutar]) sütundaki tüm değerlerin toplamını verir. Peki toplanacak değer tabloda hazır bir sütun değilse? Miktar ile birim fiyatın çarpımı gibi her satırda önce hesaplanıp sonra toplanması gereken bir değer için SUM yetmez, çünkü SUM yalnızca mevcut bir sütunu toplayabilir.
Burada iteratör fonksiyonlar devreye girer. SUMX bir tabloyu satır satır dolaşır, her satırda bir ifadeyi hesaplar ve sonuçları toplar:
Toplam Ciro = SUMX(Satışlar, Satışlar[Miktar] * Satışlar[Birim Fiyat])
İlk argüman dolaşılacak tablo, ikinci argüman her satırda hesaplanacak ifadedir. Sonuç, satır bazında çarpımların toplamıdır. Bu hesabı hesaplanmış sütunla da yapabilirsiniz ama ölçü içinde yapmak modeli büyütmez ve filtreye duyarlı kalır.
İteratör fonksiyon ailesi
SUMX tek değil, bir ailenin üyesidir. Aile mantığı aynıdır: bir tablo ve bir ifade al, her satırda değerlendir, sonra sonuçları bir toplama fonksiyonuna ver. • SUMX: ifadelerin toplamı. • AVERAGEX: ifadelerin ortalaması. • MINX ve MAXX: ifadelerin en küçüğü ve en büyüğü. • COUNTX ve COUNTAX: ifadesi boş olmayan satırların sayısı. • RANKX: her satır için sıra (ayrıca ele alınan bir iteratördür). • CONCATENATEX: ifadelerin metin olarak birleştirilmesi. • PRODUCTX: çarpım.
İteratörlerin ortak özelliği, ilk argümanın bir tablo olmasıdır. Bu tablo gerçek bir model tablosu olabileceği gibi VALUES, FILTER ya da SUMMARIZE gibi bir fonksiyonun ürettiği geçici tablo da olabilir. Geçici tablolarla iteratör kullanmak DAX'ın en güçlü kalıplarından biridir: önce bir grup tablosu kurarsınız, sonra grup düzeyinde bir ifadeyi toplarsınız.
Satır bağlamı ve bağlam geçişi
İteratörün içinde ifade yazarken satır bağlamı vardır. Satırdaki sütunlara doğrudan başvurabilirsiniz; ifade o satırın değerleriyle çalışır. Bu, filtre bağlamından farklı bir mekanizmadır. Filtre bağlamı görselin, dilimleyicinin ve satır/sütun başlıklarının getirdiği filtredir; satır bağlamı ise yalnızca iteratör ya da hesaplanmış sütun içinde var olur.
İteratörün içinde bir ölçü çağırdığınızda bağlam geçişi (context transition) gerçekleşir: satır bağlamı, otomatik olarak filtre bağlamına dönüşür. Örneğin:
Ortalama Müşteri Satışı = AVERAGEX(VALUES(Müşteriler[Müşteri Kodu]), [Toplam Satış])
VALUES her müşteriyi tek tek verir. İteratör her müşteri satırında [Toplam Satış] ölçüsünü çağırır; ölçü, o müşteriye ait filtre bağlamında hesaplanır. Sonuç, müşteri başına ortalama satıştır. Bu kalıp ortalamaların ortalamasını doğru almanın standart yoludur.
Bağlam geçişi güçlüdür ama maliyetlidir: her satırda ölçü yeniden hesaplanır. Müşteri sayısı arttıkça bu işlem ağırlaşır. Bu yüzden bağlam geçişi içeren iteratörleri çok büyük tablolar üzerinde dikkatli kullanın.
Toplam satırı tuzağı: neden toplamlar tutmuyor?
İteratörlerin en çok işe yaradığı yerlerden biri toplam satırı sorunudur. Bir tablo görselinde ürün başına fiyat ile miktar çarpımı toplamak istediğinizi düşünün. Eğer ölçüyü şöyle yazarsanız:
Yanlış Ciro = SUM(Satışlar[Miktar]) * AVERAGE(Satışlar[Birim Fiyat])
her satırda doğru görünse bile toplam satırında tüm miktarlar toplanır ve tüm fiyatların ortalamasıyla çarpılır; bu, satır satır hesaplanan toplamdan farklıdır. Çözüm iteratördür:
Doğru Ciro = SUMX(Satışlar, Satışlar[Miktar] * Satışlar[Birim Fiyat])
SUMX satırdaki çarpımı alır ve toplam satırında da aynı mantıkla toplar. Toplamlar parçalarla tutarlı olur.
Genel kural: bir ölçü kendi içinde toplama ve ortalama gibi toplulaştırmaları çarpıyor ya da bölüyorsa, toplam satırında beklenmedik bir sonuç çıkabilir. Bunun sebebi, toplulaştırma bağlamının görsel satırında farklı, toplam satırında farklı olmasıdır. Önce hesabın hangi seviyede (satır, müşteri, ürün) yapılması gerektiğine karar verin, sonra o seviyede bir tablo üzerinde iteratör kullanın.
Filtrelenmiş tabloyla iteratör: FILTER ve koşullar
İteratörün ilk argümanına FILTER ile süzülmüş bir tablo verilebilir. Örneğin yalnızca belirli bir koşulu sağlayan satırların ciro toplamı:
Büyük Sipariş Cirosu = SUMX(FILTER(Satışlar, Satışlar[Tutar] > [Eşik Değeri]), Satışlar[Tutar])
Burada eşik bir ölçü ya da parametreden gelir. Her sipariş satırı eşikle karşılaştırılır ve eşiği aşanlar toplanır.
Önemli bir performans notu: FILTER bir iteratördür ve tüm tabloyu satır satır gezer. Büyük bir olgu tablosunda FILTER(Satışlar, ...) yerine, mümkünse CALCULATE içinde sütun filtresi kullanmak genellikle daha hızlıdır. Basit koşullarda CALCULATE([Toplam Satış], Satışlar[Durum] = "Tamamlandı") yeterli ve hızlıdır. İteratör, koşul iki ölçüye ya da iki sütunun karşılaştırmasına dayandığında anlam kazanır.
Bir diğer pratik: iteratörün tablosunu mümkün olduğunca küçük tutun. Tüm satış satırları yerine benzersiz ürün listesi üzerinde çalışmak çoğu zaman yeterlidir ve çok daha hızlıdır.
Örnek senaryo: ortalama sipariş değeri ve ağırlıklı ortalama
Örneğin bir satış müdürü, müşteri bazında sipariş değerinin ortalamasını görmek istiyor. Yanlış kurulum, tüm siparişlerin ortalamasını almak olur. Doğru kurulum, müşteri bazında toplam sipariş değerini hesaplayıp sonra bunların ortalamasını almaktır:
Müşteri Başına Ortalama = AVERAGEX(VALUES(Müşteriler[Müşteri Kodu]), CALCULATE(SUM(Siparişler[Tutar])))
Bu iki ölçüm farklı sorulara cevap verir; hangisinin istendiğini raporu isteyenle netleştirmek gerekir.
Ağırlıklı ortalama da iteratör işidir. Fiyatların miktara göre ağırlıklı ortalaması şöyle yazılır:
Ağırlıklı Fiyat = DIVIDE(SUMX(Satışlar, Satışlar[Miktar] * Satışlar[Birim Fiyat]), SUM(Satışlar[Miktar]))
Pay, satır bazında ciroyu toplar; payda toplam miktardır. Böylece çok satılan ürünlerin fiyatı ortalamayı daha çok etkiler. Düz AVERAGE ise her satırı eşit sayar ve gerçek ortalama maliyeti çarpıtabilir. Finans ve satış raporlarında bu fark kararları etkileyen sapmalara yol açabilir.
Kontrol listesi ve sık hatalar
- Toplam satırının parçalarla tutmadığı ölçüde önce iteratörü deneyin.
- İteratörün içinde ölçü çağırıyorsanız bağlam geçişinin maliyetini düşünün; büyük tablolarda önce tabloyu küçültün.
- SUMX ilk argümanına her zaman bir tablo vermelidir. Sütun vermek hata üretir.
- İfadenin her satırda tek bir değer döndürdüğünden emin olun.
- Hesaplanmış sütunla iteratör ölçüsü arasında seçim yaparken: veri yenilenince değişmeyecek, filtreden bağımsız bir değer sütun olabilir; filtreye duyarlı olması gereken her şey ölçü olmalıdır.
- Sonuçlarını bir Excel örneğiyle sınayın: birkaç satırlık örnek veriyle elle hesaplayıp ölçünün aynı sonucu verdiğini doğrulayın.
Yavaş çalışan bir iteratör için Performans Analizörü'nden görselin DAX sorgusunu kopyalayıp DAX Studio'da inceleyebilirsiniz. Satır sayısı ve depolama motoru sorgu sayısı, iteratörün maliyetini gösterir.
Bu beceriyi Mindset programlarında nerede çalışırsınız
İteratörler ve satır bağlamı, Power BI İleri Düzey ve DAX eğitiminde 'DAX Diline Derinlemesine Giriş' ve 'CALCULATE ve Filtre Bağlamında Ustalaşmak' modüllerinin ortak zeminidir. Müşteri ya da ürün bazında karmaşık ortalama ve oran hesapları gereken satış analistleri, finans raporlama uzmanları ve BI geliştiricileri için uygundur.
Kurumsal ekiplerde toplam satırı tutmayan raporlar çoğunlukla bu bilgi eksikliğinden doğar; ekip içinde ortak ölçü kütüphanesi oluşturmak isteyenler için faydalıdır.
İlgili Mindset programı
Power BI İleri Düzey ve DAX
Sık sorulan sorular
SUMX ne zaman SUM'dan daha uygundur?
Toplanacak değer tabloda hazır bir sütun değil de satırdan satıra hesaplanması gereken bir ifadeyse, örneğin miktar çarpı fiyat, SUMX gerekir. Tek bir sütun toplanacaksa SUM hem daha basit hem de genellikle daha hızlıdır.
İteratör fonksiyonlar yavaş mıdır?
Her zaman değil. Satır sayısı ve içeride ölçü çağrılıp çağrılmadığı belirleyicidir. Küçük tablolarda fark edilmez; büyük tablolarda ve bağlam geçişi gerektiğinde maliyet artar. Tabloyu küçültmek ve CALCULATE ile basit filtreler kullanmak yardımcı olur.
Satır bağlamı ile filtre bağlamı arasındaki fark nedir?
Filtre bağlamı görsel, dilimleyici ve filtrelerle gelir ve hangi satırların hesaba katılacağını belirler. Satır bağlamı ise iteratörün ya da hesaplanmış sütunun o an işlediği tek satırdır. İteratörün içinde ölçü çağırınca satır bağlamı filtre bağlamına çevrilir.
SUMX içinde FILTER kullanmak doğru mu?
Kullanılabilir, koşul birden fazla sütun ya da ölçüye dayandığında gereklidir. Basit bir sütun koşulu için CALCULATE içinde doğrudan filtre yazmak genellikle daha hızlıdır, çünkü FILTER tüm tabloyu satır satır dolaşır.
İlgili rehberler
Kategori: Veri Analitiği ve İş Zekası