Total Satırında Gerçek Total Değeri Hesaplatmak
Buradaki bir önceki makalemizde Power BI Tablo Görsellerindeki Total satırının, Dip Toplam satırı olmadığını, diğer satırlar gibi onun da kendi Filter Context’inde yani Filtre içeriğinde gördüğü datada, measure’daki hesaplamayı gerçekleştirdiğini detaylıca açıklamıştık. Bu yazı öncesinde, o yazıyı buradan okuyabilirsiniz. Bu yazıda o yazının devamı olarak, total satırında dip toplam değerini hesaplatmayı inceleyeceğiz.
Bu basit görünen işlemin mantığını iyi anlayabilmek için öncesinde aşağıdaki konularda fikrinizin olması gerekiyor. Ancak yine de burada çok detaya girmeden açıklamaya çalışacağım.
– Itterations’ların Çalışma Mantığı
– SUMX İle Grup Bazlı Measure Toplamı
– Context Transition
– Hasonevalue & Hasonefilter Formül Yapıları, Farkları
Ne yapmak istediğimizi bir kez hatırlayalım; Bir önceki yazıda bayilerden, satış tutar toplamı 200.000 üzerinde olanlara %0.1 prim tutarı sütununu hesaplamıştık. Bu measure’ı aşağıdaki tabloya eklediğimizde, Total satırında, kırmızı ile işaretlenen değer geliyor. Yeşil ile işaretlediğimiz değerin gelmesini istiyoruz. Yani prim alacak bayilerin Prim Toplamlarını görmek istiyoruz.
Özetle; Total satırında, kendi üzerindeki hesaplanmış measure’ların sonucunu toplamasını isterken, diğer satırlarda tutar toplamı 200.000den büyük olan bayilerin %1ini hesaplamasını istiyoruz.
1) O halde formül çalışırken, birer tane bayi olan ara satırlarda mı yoksa Total satırında mı önce bunu anlamalı.
Bunun için Hasonevalue formülünü kullanabiliriz. HasoneValue (Bayi [Bayi Adı]) formülü, formül satırında filter context’te bir tane bayi adı varsa true, birden fazla bayi adı varsa False değerini döndürür. Böylece bu formülle, hangi satırda olduğumuzu anlayabiliriz.
Eğitimde de bazı kişiler neden şimdi diğer bayi adları göründü diye soruyor. Esas soru, bu bayi adları tabloda olmasına rağmen neden daha önce görünmüyordu olmalı 😊 Power BI yalnızca sonucu dolu olan verileri döndürür. O nedenle ilk tablomuzda, sadece satış yapmış olan 3 bayiyi getirmişti. Şimdi ise tabloya eklediğimiz measure her bayi için bir cevap döndürdüğü için (True) her bayi görünür oldu. Measure’ın en son çıktısında sadece değeri olanlar için hesap olacağı için boşlar yine tabloda görünmeyecek merak etmeyin. Bu konuda daha fazla bilgi için bu makaleyi okuyabilirsiniz. (https://www.linkedin.com/pulse/hi%C3%A7-sat%C4%B1%C5%9F-yapmam%C4%B1%C5%9F-%C3%BCr%C3%BCnleri-markalar%C4%B1-yetkililerini-g%C3%B6zden-durmu%C5%9F/)
2) Ana hedefimize devam edelim, şimdi bir tane bayi olan satırlarında yani hasonevalue formül sonucu true olan satırlarda %1 hesabını yaptıralım. False yazan Total satırına ise daha sonra bakacağız.
Bunun için üstteki formülü IF kalıbına sokup, eğer satırda 1 filtre değeri varsa o zaman tutar%1 measure’ını hesapla yazalım.
Bakın eğer true ise Tutar%1’i hesapla yazdık ama IF’in false kısmına bişey yazmadığımız için ve TOTAL satırı şimdilik hesaplanmamış oldu.
3) Şimdi de boş olan Total Satırı için, yeşil kutucuktaki sayıların toplamını istiyoruz.
Bu değerleri yukardaki tablodaki gibi görmemizi sağlayan, bu tablonun Bayi bazında özetlenmiş olması! O halde böyle bir sanal tabloyu oluşturup, tablo satırları için tutar %1 formülünü hesaplatıp o değerlerin toplamını alarak istediğimiz sonuca ulaşabiliriz. Tablo belirterek, tek tek satırlarını toplayabildiğimiz fonksiyon SUMX’tir.
SUMX (bayi, [Tutar %1]) formülü, bayi tablosunun satırlarında gördüğü her bayi için tutar%1 formülünü çalıştırır. Ve her satır için aldığı değeri hafızada tutup en sonda bu hafızasındaki değerleri toplar(klasik itterations davranışı ve SUMX yapısı).
Bu formülü de yazdığımız formülün false bölüme ekleriz;
SUMX (bayi, [Tutar %1]) formülü hakkında ek açıklamalar;
Önemli Not: Burada SumX’in de bizim gördüğümüz gibi bir bayi bazında sonuçları özetleyen bir tablo üzerinden %1’leri toplayabilmesi için mutlaka SUMX’in tablo parametresine Bayi Tanım (Dimension) tablosunun yazılması gerekir. Eğitimlerde oraya tutarların olduğu satışlar tablosunu yazanlar oluyor sıklıkla. O zaman formülünüz bayi bazında tutar toplamını değil, satışlar tablosundaki her bir satış satırının tutarına bakar! Hatalı olur, bize bayi bazında toplamlar üzerinden değerlendirme gerekli!
Önemli Not 2: Context Transition konusu. Çok kabaca, bilenler için hatırlatma babında birkaç cümle ekleyeceğim. Burada %1 formülünün bayi bazında hesaplanabilmesi için, yani bayi tablosunun her satırı için hesaplanabilmesi için Context Transition’a izin vermemiz gerekir. Yani SUMX’in formül kısmına [tutar%1] measure’ını measure adı ile çağırmalıyız. Böylece içerisine gizli bir Calculate eklenir ve böylece Context geçişi gerçekleşir. Diğer bir deyişle bayi tablosunun her bir satırındaki bay filtresini görebilir ve ilgili bayi bazında tutar%1 hesabını yapabilir.
Bu konuda önceden bilgisi olmayanlar için kısaca bir iki açıklama ekleyeceğim, bayi tablosunun yanına bir sütun açtığımızı hayal edin. O sütuna direkt SUM(satislar[Tutar]) yazarsam, satırdaki değerler sadece ROW contexttir bu nedenle hiçbir satırın aktif filtresi olmadığından satışlar tablosunun tamamının toplamı görünür her satırda.
Ama aşağıdaki gibi önceden yazdığım tutar toplamı measure’ını adı ile yazarsam, her satırda, satırdaki bayinin filtresi devreye girer ve satışlar tablosundan o bayinin tutar toplamı gelir. Çünkü measure’ları ismi ile çağırdığımızda formülümüzün başına otomatikman bir Calculate eklenir. Aşağıdaki formülü Power BI Calculate(sum(Satışlar[Tutar])) olarak okuyor. Böylece Calculate Row contexti Filter contexte dönüştürdüğü için her satırdaki bayi bilgisi ilişkili olduğu Satışlar tablosunu filtreliyor ve her bayinin kendi tutar toplamını yazmış oluyor.
bu Context transition konusu için küçük bir tanıtım. Buradan yola çıkarak, yazdığımız SUMX(bayi, [tutar%1]) formülünde, bayi tablosunun her satırı için Tutar%1 hesaplatabilmek için measure halini yazmalıyız demiştim.
Eğer bu şekilde Filter gibi, SUMX gibi tablo oluşturucu formüllerde measure adını değil de kendisini yazarsak, tablo satırlarındaki değer Row Context’ten öteye geçemez, Filter Context’e dönüşemez bu nedenle de filtreleme görevi görmez.
Buna da bir örnek olması için, SUMX li bölümde, tutar measure’ı yerine direkt SUM(tutar) halini yazdım. Bayi – bayi tutar toplamlarını 200.000 den büyük mü diye bakması gerekirken, satırdaki bayi filtresini farkedemedi ve toplam tutarı 200.000 ile kıyasladı. O nedenle bakın Total satırı uçtu gitti.
108.990’ı nasıl buldu derseniz. Onu anlamakta çözümü anlamının önemll bir adımı. Burada Tutarı Bayi bazında filtreleyemediği için her satırda SUM(Tutar) nedeniyle, Toplam Tutarı görüyor aşağıdaki gibi.
Her satır için 200.000 den büyükmü kontrolünü yapıyor. Her satır büyük çıkmış oluyor tabi. Dolayısıyla her satırın %1’ini alıp en son aldığı değerlerin toplamını gösteriyor. Tamamen hatalı bir sonuç olmuş oluyor.
Daha önce Row Context, Filter Context, Context Transition konularını bilmiyorsanız notlar kısmı sizin için yeterli gelmeyebilir. Buradaki Context Transition videosunu izlemeniz yardımcı olacaktır.
Sevgi ve Saygılar