Sanal İlişkiler – TREATAS Nasıl Kullanılır?

Veri ModeliBütçeler

Bu yazıyı okumadan önce -eğer okumadıysanız- önceki köprü tablosu yazısını okuyun lütfen. Power BI veri modelinde tablolar arası ilişkileri -genelde- fiziksel olarak yaratırız. İki tablo arasında fiziksel ilişki yaratmaksızın sanki ilişki varmış gibi davranmanın yolu TREATAS fonksiyonunu kullanmak.

Çözmeye çalıştığımız konuyu hatırlamak gerekirse, aynı granülaritede olmayan Satışlar, Tarih ve Bütçe tablolarını nasıl modellerizin farklı yöntemlerine değinmiştik: referans entity, many-to-many ve nihayet köprü tablosu yöntemini kullanmıştık.

Köprü tablosu mantığıyla Bütçe-Ürünler tablolarını bağlamıştık. Tarih tablosu ile ilişkilendirirken ise referans tarih verme yöntemini kullanmıştık.

Bütçe tablosuna eklediğim referans tarih sütununu siliyorum ve Tarih-Bütçe tabloları arasındaki fiziksel ilişkiyi uçuruyorum.

Sorunumuz gene aynı: farklı granülaritedeki tabloları nasıl modelleriz!

Bütçe verisi Yıl-Ay-Kategori seviyesinde. 2008-2009 yıllarına ait bütçe verisi var.

Satışlar tablosu ise gün-ürün seviyesinde.

Tarih tablosu olması gerektiği gibi gün seviyesinde.

Ürün-Kategori-Bütçe için köprü tablosu çözümü kalsın. Tarih tablosu ile bütçeyi başka ne şekilde modelleyebiliriz?

Ay-Yıl sütunları üzerinden fiziksel ilişki kurmaya kalksak, önceki yazıda da gördüğümüz gibi bir uyarıyla karşılacağız, many-to-many ilişki olacak ve yazdığımız metriklere göre bazen farklı davranacak ve istediğimizi hesaplamayacak!

Önce arada ilişki olmaksızın davranışın ne olduğuna bakalım bir matriste: Yıl bazında satışlar ve bütçeyi görelim.

Tarih tablosu Satışlar tablosu ile ilişkili, ok yönünde Tarih tablosundan başladığımızda satışları filtreleyebiliyoruz. Ama aynı şey Bütçe için geçerli değil, arada bir ilişki yok, dolayısıyla Tarih tablosundaki filtreleri Bütçe tablosuna taşıyamıyoruz. Taşıyamayınca da bütçe tablosunun tamamını görüyoruz her seferinde, bu yüzden de Total satırı da dahil olmak üzere tüm yılların karşısında aynı rakamı görüyoruz.

Tarih tablosundaki filtreler ifadesini biraz daha açalım. Matriste gözüken Yıl, Tarih tablosundan geliyor. DAX’ın filter context konsepti gereği, rakam gördüğümüz her hücre ilgili filter context altında hesaplanır.

Peki matriste Bütçe sütununda gözüken rakamların filter context’inde ne var? Yıl var. Her hücrede hangi yılı gördüğünü yardımcı bir metrik yazarak görelim:

Yıl Filtresinde Ne Görüyor? =
CONCATENATEX( VALUES(Tarih[Yıl]) , 'Tarih'[Yıl], "-" )

Matrise düşürelim:

Şu anki “derdimiz”, bu Tarih tablosundan gelen Yıl filtresinin, Bütçe tablosuna gidememesi, dolayısıyla filtreleyememesi.

TREATAS fonksiyonu burada devreye giriyor: Tarih tablosundan gelen Yıl filtresini al, sanki arada ilişki varmış gibi filtre olarak Bütçe tablosuna uygula! -Mış gibi diyorum, çünkü TREATAS’i de “TREAT AS” olarak ayrı yazınca “mış gibi davran” diye çevirmek mümkün.

Metriğimizi yazalım:

Bütçe = 
CALCULATE( SUM('Bütçe'[Bütçe] ) ,
   TREATAS( VALUES('Tarih'[Yıl] ) , 'Bütçe'[Yıl] )
)
-- Tarih tablosundan gelen "Yıl" filtresini al
-- Bütçe tablosunun Yıl sütunu üzerine uygula

Yıl seviyesindeki filtreleri artık Bütçe tablosuna uygulayabiliyoruz.

Ama matrise ay seviyesinde bakarsak aynı sorunun devam ettiğini görürüz! Yıl seviyesinde filtreler tamam, ama Ay seviyesindeki filtreleri taşıyamıyoruz.

Yazdığımız metriğe bu sefer Ay için ikinci bir TREATAS parametresi vererek sorunu çözebiliriz.

Bütçe = 
CALCULATE( SUM('Bütçe'[Bütçe] ) ,
   TREATAS( VALUES('Tarih'[Yıl] ) , 'Bütçe'[Yıl] ),
   TREATAS( VALUES('Tarih'[Ay] ) , 'Bütçe'[Ay] )
)
-- Tarih tablosundan gelen "Yıl" ve "Ay" filtrelerini al
-- Bütçe tablosunun Yıl ve Ay sütunları üzerine uygula

Hangi yöntemi tercih edelim?

Farklı granülaritedeki tabloları modellemek için önceki yazıyla birlikte 4 yöntem gördük.

  • Köprü tablosu
  • Referans entity
  • Many-to-many ilişki
  • TREATAS

Köprü tablosu çözümü öncelikli olarak tercih etmeniz gereken yöntem!

Tarih ve Bütçe tablolarına, Yıl-Ay değerlerini birleştirdiğiniz bir sütun eklerseniz bu sütun üzerinden bir köprü tablosu oluşturabilirsiniz.

Periyod bilgisi içeren bu tür durumları ben referans tarih vererek çözmeyi tercih ediyorum. Köprü tablosu performansa olası etkisi sebebiyle önerilen bir yöntem ama bu tür spesifik durumlar için tabloları aynı granülarite seviyesine getirmek en kolay en pratik en performanslı çözüm.

Fakat hepsi de geçerli yöntemdir ve kardinalitesi makul seviyede veriyle çalışıyorsanız aralarındaki hız farkını anlamazsınız bile.

Yazıda kullanılan veri setini ve modelleri -siteye üyeyseniz- indirebilirsiniz.

Sadece üyeler görebilir. Hızlı üyelik için sosyal medya hesabınızla giriş yapabilirsiniz!

Bloga sosyal medya hesabınızla hızlı üye olmak için ilgili ikonu tıklayabilirsiniz.

PowerBI İstanbul

Power BI, Power Query, DAX, Azure servisleri, SSAS, DW, R, veri madenciliği, veri modelleme ve veri görselleştirme üzerine Türkçe bilgi içeriğine katkı sağlamayı amaçlar.

Intellect BI blog sitesidir.

Intellect BI & PowerBI İstanbul, Microsoft Data Analytics ve Power BI Partneri 'dir.

Blog Yazılarına Üye Olun

Blog yazıları, eğitim ve meetup duyuruları posta kutunuza gelsin!

8,3K Üye