Power BI’da Tekrar Eden Verilere Sahip İki Tablo Arasında İlişki Nasıl Kurulmalıdır?
  1. Anasayfa
  2. Yazılım

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

0

Bu makalede Power BI raporlarımızda, ilişkilendirmek istediğimiz her iki tablonun da tekrar eden veriler içermesi durumunda, diğer bir deyişle 2 fact tablo arasında ilişki kurmamız gerektiğinde neler olduğunu ve aslında nasıl olması gerektiğini açıklamaya çalışacağım.

Power BI Veri Modelleme, sık sık üzerinde durduğumuz bir konu. Ancak yeni başlayanlar ilk önce DAX’ı öğrenme telaşına kapılıyor. Her zaman önerim önce Veri Modeli kavramlarına  hakimiyeti sağlamanız yönünde. Yeni başlayanların Veri Modelleme hakkında öğrenmesi gerekenleri kabaca saymak gerekirse şunları söyleyebiliriz; Dim Table & Fact Table nedir, şema nedir, Power BI’ın sevdiği şemalar hangileridir, bunları bilmek uygulama üzerinde ne işe yarar, ilişki kardinalitesi, ilişki yönleri nedir, uygulama üzerinde ne anlama gelir, nasıl olmalıdır, modelimizde olması gerektiği gibi değilse, nasıl oldurulur.

Şimdi buradaki senaryoda aşağıdaki gibi bir üretim, bir de satış tablomuz olduğunda Power BI’da ne yaparsak, ne olur ve nasıl çözüm sağlarız bakalım.

Tablolarımızda üretim adetleri ve satış adetleri ürün ve tarih bazında tutuluyor.

Üretim Tablosu:

Resim-1

Satış Tablosu:

Resim-2

Amacımız,  bu iki tablodan yararlanarak, raporda Ürün Adı ve tarih bazında Satış adedi ve Üretim adetlerini görebildiğimiz bir matrix tablo oluşturmak.Bu iki tabloyu Power BI’a çektikten sonra, her iki tabloda ortak olan sütun, Urun ID olduğu için genelde kullanıcılar ilk davranış olarak direkt ikisi arasında ilişki oluşturuyorlar. Fakat her iki tabloda da, Urun ID birden fazla kez olduğu için ilişki Çok’a çok ilişki olmuş oluyor ve bu ilişkinin default yönü “Both” oluyor.

Resim-3

Biz sürükle bırak yaptığımızda eğer ilişki türü dikkat edilmesi gereken bir durum içeriyorsa bu pencere otomatik olarak açılıyor, şuanda tablolarımızda çoka çok  ilişki algıladığı için açıldı ve uyarı bölümüne bakacak olursak, bu ilişki türünün raporda anlamlandıramayacağımız şeylere sebep olabileceğine vurgu yapıyor.

Resim-4

Çünkü both ilişki yönü, her iki tablonun da birbirini filtreleyebildiği anlamına geliyor. Bu da model büyüdükçe, beklemediğimiz/görmediğimiz döngüsel eylemlere sebep olabiliyor, raporumuzun performansını olumsuz etkiliyor. Üzerine onlarca makale var.
Ayrıca bu şekilde iki fact tabloyu direkt birbirine bağlamak, dikkatli bakıldığında report view’da da bazı sıkıntılara yol açıyor.

Diğer yandan ikinci sorun ise şu, bu tablolarda veriler tarih ve urun adı bazında bulunuyor. Yani hangi urun hangi tarihte kaç tane satmış ya da üretmiş diyebilmek için bir de tarih üzerinden ilişki kurmak gerekiyor. Ancak Power BI‘da iki tablo arasında aynı anda yalnızca bir tane ilişki aktif olabilir. Dolayısı ile siz bir de tarihler arasında ilişki kurmak istediğinizde aşağıdaki gibi 2.ilişki pasif oluşuyor.  Yani şuan bu date ilişkisinin, tablolar arasında birbirini filtreleme yeteneği bulunmuyor.

Resim-5

Şimdi ilk önce ilk oluşturduğumuz ilişkinin rapor görünümünde neler yaptığına özetle bir bakalım;

Durumu tek ekrandan rahatlıkla görebilmek için önce tabloların sadece kendi sütunlarından oluşan ayrı ayrı matrixleri oluşturdum.  Tabi, genelde böyle değil de her iki tablonun verilerinin bir tabloda yazmasıdır beklentimiz. Onun için de alttaki TEST Tablosunu oluşturdum. Test tablosunun Urun Adı sütununu Satışlar tablosundan aldım. Çünkü burada hangi tablodan almam gerektiğine dair bir ayraç yok henüz. Şimdi neler olduğunu inceleyelim.

Resim-6

Üretim tablosuna bakın, 50 adet TV üretimi olmasına rağmen, Test Tablosunda görünmüyor, ayrıca toplamı bulmaya çalışırken onu da katıyor ve 200 gösteriyor. Neler oluyor?

1) Öncelikle, test tablosuna Urun Adı sütununu Satışlar tablosundan aldığım için ve o tabloda da TV satışı hiç olmadığı için haliyle TV diye bir context yok, filtreleyici yok. O halde bu şekilde birden fazla tablodan değer göstereceğimiz grafiklerin filter contextleri, tüm verileri içeren ortak bir tablodan gelmeli! Ürünlerse, ürünlerin tamamını içeren bir tablo, şehirler ise şehirleri içeren bir tablo!

2) Diğer konu; madem TV yok, toplama neden TV’nin değerini de getiriyor?  Aslında burada bilmemiz gereken ayrı bir konu. Kabaca şöyle diyebiliriz; en altta gördüğünüz tabloda, 1. Satırda gördüğü context “Bilgisayar”, ancak total satırında matrix içerisinde belirtilen bir filtre yok, orası “Total”, yani belirtilen işlemi üretim tablosunun tamamına uyguluyor. Tablomuzun Üretim Adedi sütunun tamamını topluyor. O nedenle 200!

Özetle; Tablolarınıza filtreleyici olarak aldığınız sütunun hangi tablodan geldiği çok önemli.  Grafiklerin filtreleyicilerini, tüm verilerin olduğu ve her iki tabloyu da filtreleyebilen bir tablodan almazsak, bazı veriler hiç görünemeyecek ve grafiklerde eksik veriler göreceğiz.   Tam tersi düşünelim, Ana değer olarak tabloya Üretim tablosundan Ürün Adını koymuş olsaydınız, gösterilecek tüm ürünler, üretilmiş olan ürünler olurdu. Bu iyi gibi, ama bu seferde bir tarih seçtiğinizde belki de o tarihte satılmış ama yeni üretim yapılmamış bir ürün var ise, bu kayıtları gözden kaçırmış olacaktınız.

Bu halde iken bir de tarihleri getirirseniz anlam vermeniz daha da zorlaşabilir. Hatırlayın, modeldeki tek aktif filtre, Urun ID!  O halde aslında aşağıda, tek filter context’imiz aktif ilişki üzerinden tablolara uygulanan “Urun Adı “. Dolayısıyla henüz; ilgili tarihte satılan ürün ya da üretilen ürün diye gösteremeyiz.

Resim-7

Peki çözüm nedir?

Bu durumda, her iki tablodaki tüm ürünlerin yer aldığı bir ara tablo gereklidir. Buna “Shared Dimension” da deniyor.

Bu kurgu;
1) Shared Dimension, Çok’a çok ilişkiyi ortadan kaldırarak performans kayıplarını önleyecek,

2) Az evel bahsettiğimiz gibi eksik veri gösterimlerinin önüne geçecek.

3) Tabloları istediğimiz kadar çok konuda eşleştirebileceğimiz. Mesela burada hem tarih hem de ürün bazında sonuçlara ulaşabileceğiz. Tabloların ikisini de aynı anda tarih ya da ürün adına göre slicer’dan doğru şekilde filtreleyebileceğiz.

Devam edelim. Bize, tüm ürün adlarının birer kez yazıldığı bir Dimension tablo lazım demiştik. Eğer veritabanınızda,  böyle bir tablo varsa direkt onu Power BI’a alabilirsiniz. Yoksa aşağıdaki gibi Power Query katmanında 1-2 dakika içerisinde o tabloyu hazırlayabilirsiniz. Bunun için bir çok yolumuz var aslında, TB’lık bir proje yapmıyorsanız aşağıdaki yöntem ile ilerlenebilir ilk etapta. Home Sekmesinden Transform Data butonu ile PowerQuery’ye geçeriz, Append Query ile Satış ve üretim tablosunu alt alta getirip, gereksiz kolonları kaldırıp, geriye kalan iki sütunu seçip yinelenenleri kaldırabiliriz.

Resim-8

Artık her iki tablodaki UrunID ve UrunAdlarını içeren ve yinelenmeyen harika bir tablomuz var. Data refresh olduğunda bu iki tablo ayrı ayrı yeniden oluşacak, biraraya gelecek ve yinelenenler kaldırılmış olacak, böylece her iki tabloya eklenen yeni ID’ler ve Ürün Adları  bu tabloya da eklenmiş olacak. Yani tablomuz hep güncel olacak. Böyle bir tablonun oluşması için PowerQuery’nin her data refresh’te aynı işlemleri adım adım tekrarlayacağını unutmayın. Dolayısı ile bu ara tablonun aslında database’den hazır gelmesi büyük modellerde daha performanslı olmasını sağlayacaktır.  Şimdi PowerQuery penceresini kapatalım ve model bölümüne geçelim. Önce ilk başta oluşturduğumuz ilişkinin üzerine sağ click yapıp o ilişkiyi silelim.

Resim-9

Şimdi olması gerekeni yapalım, tüm verilerimizden bir kere içeren Urunler tablosunu sırasıyla Satış ve Üretim tablosuna bağlayalım.

Resim-10

Böylece Power BI’da en performanslı çalışan ve görünmeyen hataları ortadan kaldıran One To Many ilişkisine ulaşmış olduk.

Rapor görünümüne geçip neler olduğuna bir bakalım. Test Tablomuzda Üretim Adetleri Urun Adına göre filtrelenmemiş, toplam değeri gösteriyor. Hatırlayın, Urun Adı sütununu Satışlar tablosundan getirmiştik o matrixe. Sağ taraftaki modele bakın, Satışlar tablosu direkt olarak Üretim tablosunu filtreleyemeyeceği için, o şekilde tablonun toplam değeri gözüküyor. Peki aslında hangi tablo her iki tabloyu da doğru şekilde filtreleyebilir? Artık cevabı biliyorsunuz. Urunler Tablosu!

Resim-11

O halde hemen matrixe Urunler tablosundaki Urun Adını getirip, Şuankini kaldıralım. İşte şimdi Ürün bazında her iki tablodaki adetleri de doğru şekilde görebiliyoruz!

Resim-12

Not: Fact tablolarınızda Ürün Adlarının bulunması gereksiz gördüğünüz üzere. Zaten hiç bir zaman filtreleyici olarak Fact tablosundan sütun kullanmıyoruz. Her zaman Dimension Tablolar doğru sonuçları veriyor. Hem son kullanıcınızın kafasını karıştırmamak için hem de Fact tablolarından metinsel verileri kaldırarak Modeli hafifletmek için, Power Query katmanındyken, Fact tablolardan ürün isimlerini kaldırmanızı ve yalnızca Dimension tablonuzda tutmanızı tavsiye ederim.

Son adım olarak, tarihe göre de üretim ve satış adetlerini kırmak istersek ne yapmak gerekir? Aynı Urun Dimension’u gibi Date table eklememiz gerekir. 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 ardışık  ve tekrar etmeyen günlerden oluşması gerekiyor. Eğer veritabanınızda varsa direkt o tabloyu modelinize alabilirsiniz.

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

Modeling sekmesinden, New Table butonuna tıklayarız;

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ı, 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.

Resim-15

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, matrixte filter context, ilişkiler üzerinden gelen Urun Adı ve Date sütunu değerleri olmuş olur. 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.

 

Resim-16

Doğru modeller üzerine kurulan raporların, detaylarına inmesi, Dax ifadelerinde beklenen yanıtları vermesi, genişletilip büyültülmesi mümkündür. Aksi durumlarda hem rapor geliştirmelere karşı kapalı, hem de boyut büyüdükçe performans açısından sorunlara açık olacaktır.

Bu konuyla ilgili sorularınızı  alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.

Referanslar

www.mshowto.org

TAGs: Power BI’da tekrar eden verilere sahip iki tablo arasında nasıl ilişki kurulur, Power BI Nedir,Power BI nerelerde kullanılır,Power BI örnekleri,Dim Table & Fact Table Nedir

Bu İçeriğe Tepkin Ne Oldu?
  • 18
    harika_
    Harika!!
  • 0
    be_enmedim
    Beğenmedim
  • 0
    _ok_iyi
    Çok iyi
  • 0
    sevdim_
    Sevdim!
  • 0
    bilemedim_
    Bilemedim!
  • 0
    olmad_
    Olmadı!
  • 0
    k_zd_m_
    Kızdım!

Bahar Durmuş, 1986 yılında Silivri’de doğdu. Yıldız Teknik Üniversitesi, Bilgisayar ve Öğretim Teknolojileri Öğretmenliği bölümünden mezun oldu. Üniversite yıllarında ekip arkadaşlarıyla eğitim müfredatına ve öğretim ilkelerine uygun “Egiyaz” isimli eğitim yazılımını geliştirdi. Üniversite’de bitirme projesi olarak, öğretim ilkeleri ile uyumlu Microsoft Office Eğitimleri içeriğini hazırladı, video anlatımlarını yaptı. Moodle sistemi üzerine yüklenen bu eğitim, Ilhan Varank tarafından Afyon Kocatepe Üniversitesinde eğitimi destekleyen uzaktan eğitim materyali olarak uzun yıllar kullanıldı. Üniversite sonrası İstanbul'da kendi iş dallarının öncü firmalarında görev aldı. İlk olarak 3 yıl boyunca BilgeAdam Kurumsal‘da, Türkiye’nin kurumsal firmalarına, Word, Excel, Access, VBA eğitimleri ve danışmanlık hizmetleri vermek üzere Microsoft Office Danışmanı olarak görev aldı. Sonrasında 3 yıl boyunca Finansbank’ta Eğitim, Raporlama ve İş Geliştirme uzmanı olarak görev aldı. Aynı zamanda Bilgegüç danışmanlık firmasında kurumsal eğitimler vermeye devam etti. Microsoft’un Power BI’ı dünyada duyurmasıyla beraber PeakUp Bilişim Teknolojileri’nde “Business Applications Manager” olarak yeni görevine başladı. Burada Power BI, PowerApps ve şimdiki adıyla PowerPlatform alanında Türkiye’deki ilk uygulamaları geliştirdi. Aynı zamanda firmaların yenilenen MS Office ürünlerinde geride kalmaması için çeşitli eğitim içerikleri geliştirdi ve Office eğitimlerini ekibiyle beraber sürdürmeye devam etti. 2017 yılında Kurumsal Çözümler Zirvesinde “10 Dakikada Mobil Uygulama Geliştirin” konulu oturumla, Türkiye’ye PowerApps’i duyuran kişilerden oldu. Şuanda kendi firması olan BI CASTLE Bilişim Teknolojileri firmasında PowerPlatform Eğitmeni / Danışmanı olarak hizmet vermeye devam etmektedir. 10 Yıllık Microsoft ürün ailesi kariyerinde bugüne kadar Türkiye’nin önde gelen firmalarında başarı ile sonuçlanan yüzlerce eğitim ve onlarca danışmanlık yapmıştır.

Yazarın Profili
İlginizi Çekebilir

Bültenimize Katılın

Tıklayın, üyemiz olun ve yeni güncellemelerden haberdar olan ilk kişi siz olun.

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir