Power BI’da iki tablo arasında birden fazla ilişki ne zaman gereklidir, nasıl yapılabilir?

Satış tablolarımızda sipariş tarihi, teslimat tarihi gibi farklı tarih bilgileri yer alır. Raporlarımızda belirli bir tarihteki durumu incelerken, örneğin bir haftayı incelerken sipariş tarihi o hafta olan satışların adet toplamını ve aynı zamanda teslimat tarihi o hafta olan satışların adet toplamını da görmek isteriz. (ya da tutar toplamlarını) Bu raporlarımızda en sık ihtiyaç duyduğumuz gösterimlerden biridir.

No alt text provided for this image

Bu işlem için tarih tablosuyla satışlar tablomuz arasında hem sipariş hem de teslimat tarihi üzerinden iki farklı ilişki kurmamız gerekir ancak iki tablo arasında yalnızca bir tane ilişki aktif olabilir. Diğerleri pasif olur.

O halde pasif ilişkiler üzerinden hesaplamalarımızı nasıl yapabiliriz? Genellikle hem rapor dizaynı açısından dağınık olan, hem de rapor performansını negatif etkileyecek yöntemler kullanıldığını görüyoruz. Zaman kaybetmeden, bu hesaplamaları yapmanın ne kadar kolay bir yöntemi olduğunu görelim.

Öncelikle, Power BI modellerinizde mutlaka Tarih tablosu kullanmalısınız. Bu yazıyı halihazırda Tarih tablosu kullanmakta olup birden çok ilişkide çözüm soranlar için yazıyorum.

Bu örnekte Adventure Works datası kullanıyoruz. Modelde Tarih tablomuz Date olarak isimlendirilmiş ve Satış tablomuz da FactInternetSales olarak isimlendirilmiş durumda. Buradaki Date tablosundaki Date sütunu ile Satış tablomuzdaki Sipariş sütununu ilişkilendirdik. Bu işlemi yaptığımızda iki tablo arasında 1’e-Çok bir ilişki oluştu. İlişkinin yönü Date tablosunda Satışlar tablosuna doğru. Peki bunlar bizim için ne ifade ediyor?

No alt text provided for this image

İlişkiler, veri modelimizdeki tablolar arasında gezinmemizi sağlıyor. Power BI’da ilişkileri daha net ifade edebilmek için şöyle demek daha açıklayıcı olur; ilişkiler, ilişkinin yönüne bağlı olarak bir tablonun diğer tabloyu “filtreleyebilmesi” anlamına gelir. Filtreler iki tablo arasındaki aktif ilişkinin anahtar sütunlarına göre çalışır.

İlişkinin yönü ne ifade ediyor? Date tablosunda yılın her günü için yalnızca bir satır bulunuyor. Bu nedenle ilişkinin 1 (One) tarafı olur. FactInternetSales tablosu yani Satış tablomuzda internet satışları bulunuyor. Herhangi bir tarihte birden fazla satış olabileceği için ilişkinin Çok (Many) (*) tarafı oldu. 1’e Çok ilişkilerde, ilişkinin yönü default olarak 1’den Çok tablosuna doğrudur. Bu yön, 1 tablosundaki herhangi bir veriye göre, Çok tablosunu filtreleyebileceğimiz anlamına gelir. Böylece Date tablosundaki herhangi bir alan filtrelendiğinde, date sütunu üzerinden Fact Internet Sales tablosundaki, Sipariş tarihi sütunu da otomatik filtrelenir. Biz toplam ya da ortalama vb. aldığımızda da bu filtre sonuçlarına göre sonuçlar hesaplanır.

Tüm bu bilgiler ışığında;

Satış tutarını bulmak için aşağıda görseldeki gibi SUM metriğini oluşturduk. Rapor görselindeyken, Date tablosundan Yıl, Ay bilgilerini ve yeni oluşturduğumuz metriğimizi matris tablo üzerine bıraktık. Böylece elimizdeki SUM metriği, date tablosundaki date üzerinden sipariş tarihi sütununa göre filtrelenerek ilgili tarihteki satış tutarı bulundu. 

No alt text provided for this image

İşte şimdi yukardaki görsele, teslimat tarihine göre tutar toplamını da eklemek istiyorsak, Date tablosundan gelen tarihlere göre FactInternetSales tablosundaki teslimat tarihinin filtrelenebilmesi gerekir. Bu yüzden de Teslimat Tarihiyle de bir ilişki oluşturmamız gereklidir. Ancak iki tablo arasında yalnızca bir ilişki aktif olabileceği için bu ilişki pasif durumda oluşur.

No alt text provided for this image

Pasif durumda olan ilişkiler kesik çizgi ile, aktif olanlar düz çizgi ile gösterilir. Pasif ilişkiler ekstra bir fonksiyon yazmadığımız sürece etkisiz eleman olarak dururlar. Biz yine de “kullanmadığımız” pasif ilişkileri hemen sileriz, çünkü büyük veri modellerinde inanılmaz göz yorucudurlar.

Peki pasif ilişkileri hesaplamalarda nasıl kullanacağız?

Pasif olan ilişkilere göre tutar toplamı bulmak için Userelationship Dax fonksiyonunu kullanarak yapacağımız hesaplamanın hangi ilişki üzerinden çalışacağını belirteceğiz böylece pasif ilişkiyi de istediğimiz sonuçları bulmak için kullanmış olacağız.

No alt text provided for this image

Userelationship Fonksiyonu

Bu dax fonksiyonu, içerigi-bağlamı degiştirmemize hizmet eden Calculate fonksiyonu ile beraber kullanılır. (Başka ihtiyaçlarda, girdi olarak Filter verebildiğiniz diğer dax ifadelerinde de kullanılabilir.) Calculate’in ilk parametresine aggregation ifademizi yazıyoruz (sum, count average vb.) Bu örnekte tutar toplamı istediğimiz için SUM kullandık. 2.parametresine de koşulumuzu/sum işlemini yapacağı bölgeyi yazıyoruz. Bu örnekte Userelationship fonksiyonumuzu kullanarak hangi sütunlar arasındaki ilişki üzerinden çalışmasını istediğimizi belirtiyoruz. Date sütununun Teslimat Tarihi sütununu filtrelemesini istediğimiz için, Teslimat Tarihi ve Date’in ilişkisininin anahtarlarını yazdık formülümüze. Unutmayın, burada varolan ilişkinin sütunlarını belirtiyoruz, eğer ilişkiler şemasında, ilişki belirtilmemiş olsaydı bu formül çalışmazdı. Dikkat edin bu formülde kullandığınız Pasif ilişkileri yanlışlıkla silmeyin 😊

Özetle; SUM fonksiyonu ile yazdığımız SiparişTarihine GöreTutarToplamı metriği, aktif ilişkinin sütunu filtrelenerek bulunurken; Userelationship ile SUM yaptığımız TeslimatTarihineGöreTutarToplamı Metriği pasif ilişki üzerinden filtrelenerek ayların satış tutar toplamlarını bulmuş oluyor. 

No alt text provided for this image

Birden fazla ilişkiye göre hesaplama yapmak istediğinizde, önce o ilişkileri oluşturmak gerektiğini, daha sonra pasif olanlar üzerinden hesaplamalar yapabilmek için Calculate ile beraber Userelationship dax fonksiyonlarını kullanabileceğimizi görmüş olduk.

Umarız kulağınıza kar suyunu kaçırmışızdır 😊

Sevgiler