Power BI’ın Total Satırındaki Hesaplama Mantığı Nedir?
Bu yazıda Power BI raporlarında, tabloların altında gördüğümüz Total satırını inceleyeceğiz. Kelime anlamından dolayı tabloda ilgili sütundaki verilerin toplamını verir diye düşünüyoruz. Fakat durum öyle değil. O zaman birinci sorumuz, total satırında gördüğümüz sayılar hangi hesaplamanın sonucunu gösteriyor? İkinci sorumuz ise, tablodaki verilerin toplamını göstermesini nasıl sağlayabiliriz?
Basite indirgeyerek anlatmaya çalışacağım için çok basit örnekler seçeceğim, eğer mantığını doğru anlarsanız sonrasında zaten istediğiniz senaryonuza kendiniz uygulayabileceksiniz.
Aşağıda Şehir Adı bazında Adet Toplamlarını gösteren bir tablo oluşturdum.
-Bayi Adı, Bayiler Dimension tablosundan Bayi Adı sütunun kendisi,
-Adet Toplamı, Sum(Satış[Adet]) şeklinde oluşturulmuş bir measure.
Veriyi iyice azaltıp toplamları hemen aklımızdan da yapabilelim diye, yıl olarak yalnızca 2021’i seçtim slicer’dan.
Şimdi buraya baktığımızda Total satırı sanki 396 + 80 + 110 değerlerini toplayıp 586 yazmış gibi duruyor. Ancka öyle değil, hadi matematiksel olarak yaptığı işlemi incelemeye başlayalım.
Yukarıdaki tabloda her satırda, satırdaki Bayinin filtresi tabloya uygulanıyor ve süzülmüş data üzerinden adet sütunu toplanıyor. Örneğin Ayazağa satırında iken;
- Bayi tablosundan Ayazağa filtrelenir,
- Bayi tablosu ile satışlar Bayi ID üzerinden ilişkili olduğu için; Bayi tablosudaki filtreler Bayi ID üzerinden satışlardaki Bayi ID’ yi filtreler.
- Böylece Satışlar tablosunda yalnızca Ayazağa’ya ait satışlar kalır.
- Adet measure’da bu filtrelenmiş tabloda, Adet sütunun toplamını alır.
Rapor ekranında kaç satırımız varsa bu işlem o kadar kez gerçekleşir. İşte kilit bilgi; Total satırına gelindiğinde de işlem aynı şekilde tekrarlanır!
Her satırda bir şehrin filtresi varken, Total satırında bir bayi filtresi yoktur. Dolayısıyla formül o esnada tabloda tüm bayilerin satışlarını görür ve Adet measure’ı o tablonun Adet sütununu toplar.
Yani Total’da gördüğümüz değer, aslında kırmızı ile işaretli Adet sütunundaki değerlerin toplaması yapılarak bulunmaktadır!
Bu şekilde basit toplam işlemlerinde her iki şekilde de sonuç aynı olduğu için Total Satırı sorun olmuyor. Ancak biraz daha sum dışında measure’lar yazmaya başlayınca, Total satırı yanlış bir sonuç gösteriyor diye yakınmaya başlıyor Rapor yapan/okuyan kişiler.
Şimdi de öyle bir örnek üzerinden önce hızlıca duruma bakıp sonra çözüm oluşturalım. Farzedelim belirli bir satış tutarını yakalayan bayiler için %1 prim verilecek, bizim de bunu hesaplamamız gerekiyor.
Aşağıdaki if formüllü measure, “Eğer filtrelenmiş verilerde topladığın adet toplamı 200.000 ve üzerinde ise, tutar toplamının %1’inin hesapla” dememizi sağlar.
Tutar % 10 = IF([tutartoplami]>=200000, [tutartoplami]*0.01)
( Burada basit tutmak için direkt bir sayı yazım koşula. Gerçek senaryolarda, statik olarak 300 yazmak yerine bir hedef tablosundan ilgili şehrin o yılki hedefini getiren dinamik measure alınabilir ya da geçen yılki satışı ile kıyaslanabilir hatta şirket içerisindeki sıralamasına göre kıyaslanabilirdi. Onlarca senaryo ile karşılaştım özellikle perakendecilerin bazıları çok ilginç şeyler istiyor 😊 )
Şimdi, Tutar measure’ını ve bu Tutar %10 measure’ını daha önceki tablomuzun yanına getirelim.
Gördüğünüz gibi Total satırı eğer üsttekilerin toplamı olsa idi 9.920 yazardı ama 11.630 yazıyor.
Bir önceki örnekte olanları düşünün, rakamın hangi işlemin sonucu olduğunu tahmin edebiliyor musunuz?
Hadi işlem adımlarını açalım:
Ne demiştik, ilgili measure’daki formül, tablonun her satırı için tek tek çalışır, Total satırı da dahil!
Formül ne diyordu? “ Bulunduğun satırın tutar toplamı, 200.000’den büyükse bulunduğun satırın tutar toplamını 0.1 ile çarp.”
Ayazağa satırında iken;
Ayazağa ile filtrelenmiş datadan Tutar toplamını bulur (792.000)
792.000, 200.000’den eşit yada büyük mü diye bakar. (çünkü formülde >= kullanıldı) “Evet büyük” sonucunu aldığı için 792.000 sayısını 0.1 ile çarpar. Sonuç tablodaki gibi 7.920 gelir.
Köksal Satırında iken;
Köksal ile filtrelenmiş datadan tutar toplamını bulur (200.000)
200.000 değeri 200.000’e eşit yada büyük mü diye bakar.
“Evet büyük” sonucunu aldığı için 200.000 sayısını 0.1 ile çarpar. Sonuç tablodaki gibi 2.00 gelir.
Zekeriyaköy Satırında iken;
Zekeriyaköy ile filtrelenmiş datadan tutar toplamını bulur (171.000)
171.000 değeri 200.000’e eşit yada büyük mü diye bakar.
“Hayır, büyük değil” sonucunu aldığı için formül bu satır için bir hesaplama yapmaz.
TOTAL satırında iken;
Bayi filtresi olmayan, yani 3 bayinin de olduğu datadan tutar toplamını bulur. Toplam= 1.163.000
Bu değer, 200.000’den büyükmü diye bakar. “Evet büyük” sonucunu aldığı için tutar toplamını 0.1 ile çarpar. Sonuç tablodaki gibi 11.630 gelir.
Yani TOTAL satırındaki işlem; üstteki değerlerin toplamı değil, kendi gördüğü datanın kural sonucunda hesaplanmış değerini gösteriyor. Diğer bir deyişle, tablodaki her satır – Total Satırı da dahil olmak üzere, kendi gördüğü data üzerinden measure’da belirtilen işlemi yapar.
Burada kendi gördüğü dediğimiz kısma aslında literatürde “Filter Context” – “Filtre Bağlamı” diyoruz. Daha önceden bu kavrama alışık değilseniz, yazıyı okurken zorlanmamanız için yazıda kullanmadım. Ancak DAX tarafında bilinçli fromül yazacağım diyorsanız kesinlikle bu bağlamın en alt katmanına kadar bilincinde olmalısınız.
Umarım Total’ın Power BI Formula Engine’de hesaplanma biçimi anlaşılmıştır, kendi şirket verilerinizden önce, böyle basit datalarda örnekler çözerek sonuçları irdelemenizi tavsiye ederim.
Total Satırında istediğimiz gibi, Sütundaki değerlerin toplamını hesaplatmayı anlatan yazı haftaya hafta başında geliyor 😊
O zamana kadar şimdilik, Total Satırının başlık adını değiştirmeyi, bir de Total satırını tablolardan tamamen kaldırma seçeneğini ekleyeyim;
Görüşmek üzere,