Power BI’da Tekrar Eden Verilere Sahip İki Tablo Arasında İlişki Nasıl Kurulmalıdır? – 2

Bir önceki yazıda iki fact tablo arasında ilişki kurarken, fact tabloları direkt birbirine bağlamamak gerektiğini; onun yerine shared dimension table oluşturmak ve fact tablolar ile dimension tablosu arasında ilişki kurmak gerektiğini görmüştük. Eğer okumadıysanız, bu yazıdan önce onu buradan okumanızı tavsiye ederim. Bu yazıda shared dimension oluşturmamızı destekleyici ikinci bir sebebi  göreceğiz.


Senaryomuzu şöyle; Üretim ve Satış Adetleri olmak üzere iki tablomuz var. Bu tablolardan ürüne ve tarihe göre satış ve üretim adetlerini raporumuzda aynı görselde göstermek istiyoruz.

Bu durumda tabloların hem tarihe hem de ürüne göre filtrelenmiş olması gereklidir.

ilk makaledeki yöntemi bilmeseydik ve nasıl hatalara yol açtığını bilmeseydik, muhtemelen önce Urun ID’ler üzerinde bir ilişki kurardık, sonra da Tarihler arasında bir ilişki kurardık. Ancak Power BI’da iki tablo arasında aynı anda yalnızca bir tane ilişki aktif olabilir. Dolayısı ile 2.ilişki pasif oluşuyor.  Yani şuan bu date ilişkisinin, tablolar arasında birbirini filtreleme yeteneği bulunmuyor.

Resim-5

Diğer hataları şimdilik gözardı edip baktığımızda, tarihe göre değil yalnızca ürünlere göre filtre yaparak, ürünlerin adetlerini getirdiğine dikkat edelim. Soldaki görsel Üretim verilerinin kendisinden oluşuyor. Sağdaki görsel, en başından beri üzerinde çalıştığımız Urun Adlarını satışlar tablosundan aldığımız görsel. Bilgisayar satışının 28 Mart’ta 40, 28 Nisan’da 40 adet olduğunu görüyoruz. Ama sağdaki tabloda tarihe göre bir filtreleme yapmadığı gibi veriyi çoklayarak getiriyor.

Bu şekilde bariz görünen başka bir sorunu daha burada da hatırlatalım. Yukarıdaki gibi herşeyi tek bir görselde göstermediğimizi ve dolayısı ile ilk etapta bu hatayı fark etmediğimizi farzedelim. Bir görselimiz var ve slicer’dan seçtiğimiz tarihteki verileri göstermesini istiyoruz. Soldaki görsel satış tarihi tablosundaki tarihleri, sağdaki görsel üretim tablosundaki tarihleri gösteriyor. Slicer’ı hangisinden oluştururuz? Satış tarihinden oluşturursak, Slicer sadece 28 Mart ve 28 Nisan tarihleri kapsayacak. Bu sefer biz diğer üretim tarihlerine göre filtrelemek yapamamış olacağız. Üretim tarihlerinden oluştursak, bu sefer de satış tarihleri görünmeyecek. O halde mutlaka her iki tablodaki tüm tarihleri içeren ortak bir tablomuz olmalı. İşte yine Shared Dimension ihtiyacı ortaya çıkmış oldu.

O halde ilk önce Üretim ve Satışlar tablosunu aşağıdaki şekilde ürünler tablosu(Dimension) ile ilişkilendirelim.

Şimdi tarihe göre de üretim ve satış adetlerini filtreleyebilmek için, aynı shared dimension mantığı ile bir date table oluşturup onu da fact tabloları ile ilişkilendirelim. Date table, daha bir çok sebepten modele en başından eklenmelidir. Kendisi başlı başına bir makale konusu. Şimdilik sadece buradaki görevi için anlatalım.  Date table’ın belirtilen iki tarih arasındaki tüm tarihleri içermeli ve hiç bir tarihi tekrar etmeyecek şekilde olmalıdır. Eğer veritabanınızda Date Table varsa direkt o tabloyu modelinize alabilirsiniz.

Hızlıca Date table’ı modele eklemek için aşağıdaki Date Table oluşturan kodu kullanabiliriz.

Modeling sekmesinden, New Table butonuna tıklayalım,

Resim-13

Bu kodu açılan formül barına aşağıdaki gibi yapıştırıp Enter tuşuna basarız.

Date =
ADDCOLUMNS (CALENDAR (DATE(2000;1;1); DATE(2025;12;31)+365);
“DateAsInteger”; FORMAT ( [Date]; “YYYYMMDD” );
“Year”; YEAR ( [Date] );
“Monthnumber”; FORMAT ( [Date]; “MM” );
“YearMonthnumber”; FORMAT ( [Date]; “YYYY/MM” );
“YearMonthShort”; FORMAT ( [Date]; “YYYY/mmm” );
“MonthNameShort”; FORMAT ( [Date]; “mmm” );
“MonthNameLong”; FORMAT ( [Date]; “mmmm” );
“DayOfWeekNumber”; WEEKDAY ( [Date];2 );
“WeekNumber”; WEEKNUM ( [Date];2 );
“DayOfWeek”; FORMAT ( [Date]; “dddd” );
“DayOfWeekShort”; FORMAT ( [Date]; “ddd” );
“Quarter”; “Q” & FORMAT ( [Date]; “Q” );
“YearQuarter”; FORMAT ( [Date]; “YYYY” ) & “/Q” & FORMAT ( [Date]; “Q” ))

Resim-14

Üstteki görselde görüldüğü üzere, bu kod sayesinde 2000 yılından, 2025 yılına kadar her gün için bir Tarih satırını içeren ve her günün Yıl, Ay vb. değerlerini gösteren bir tablo oluştu. (Tarih aralığı manuel değiştirilebilir ya da fact tablolarınızdaki max ve min tarihlerden beslenecek şekilde dinamik hale getirilebilir. )Date table ile ilgili diğer detayları başka bir makalede konuşmaya devam ederiz. Şimdi  aşağıdaki şekilde Date sütunları üzerinden tablolarımızla ilişkilendirelim.

Böylece aşağıdaki görselde görebileceğiniz üzere, üretim adedi ve satış adedi hem ürün hem de tarih filtresine göre kırılmış olur. Diğer bir deyişle, görselde filter context, ilişkiler üzerinden gelen Urun Adı ve Date sütunu değerleri olmuş olur.

Üstelik artık bir tarih slicer’ı oluşturacağımız zaman, Date table üzerinden güvenle oluşturabiliriz! İlişkilendirdiğimiz Date table hem tüm tarihleri kapsıyor hem iki tabloyu da filtreleyebiliyor.

Resim-16

Bu model sayesinde, rapora stok gibi yeni bir fact table eklendiğinde tek yapmanız gereken o tabloyu da bu urun ve Date Dimension tabloları ile ilişkilendirmek olacak. Böylece stokları da seçilen tarih ve ürüne göre filtreleyebiliriz.

Dimension Table kullanmak, Power BI’da Star Schema modellere ulaşmanızı sağlayacak. Burada da görüldüğü üzere bu şekilde kurulan raporların, doğru çalışmasını sağlamak, Dax ifadelerinde beklenen yanıtları vermesi, modele yeni eklenen tablolarla kolayca anlamlı ilişkiler oluşturmak mümkündür. Aksi durumlarda hem rapor yeni eklemelere karşı kısır olacak, hem de boyut büyüdükçe performans açısından sorunlara açık olacaktır.

Sevgiler