Daha önce iterator fonksiyonları, yani satır bazlı işlem yapan fonksiyonları SUMX üzerinden anlatırken, bu fonksiyonların tablolar arası ilişkilerin farkında olmadığını belirtmiştim. Fakat farketmelerini sağlayacak komutlar mevcut: RELATED ve RELATEDTABLE.
Yazıda kullanacağım modelin tablolar arası ilişkileri ekteki gibi:
Power BI’da en sık kullandığımız ilişki tipi One-to-Many: One tarafındaki her bir tekil varlık için, Many tarafındaki tabloda bir veya daha fazla kayıt vardır veya hiç yoktur. Model üzerinden örneklemek gerekirse, her bir “Ürün Kategorisi”‘nin altında birden fazla “Alt Kategori” olabilir, aynı alt kategoriye ait birden fazla ürün olabilir, bir ürün defalarca satılmış olabilir.
RELATED fonksiyonu, “many” tarafındaki tabloda satır bazlı bir işlem yaparken, ilgili satır için ilişkinin “one” tarafındaki kaydı bulur ve bu kaydın sütun değerlerine erişmemizi sağlar.
Excel’deki VLOOKUP fonksiyonunun DAX versiyonu diyebiliriz.
Diyelim ki “Ürünler” tablosuna her bir ürünün “Alt Kategori” ve “Kategori” isimlerini birer sütun olarak getirmek istiyoruz: “Ürünler” tablosu, “Ürün Alt Kategorileri” ve “Ürün Kategorileri” tablolarının “many” tarafında. Yani her bir kategori ve alt kategori için “Ürünler” tablosunda birçok ürün olabilir.
“Ürünler” tablosuna RELATED komutunu kullanarak yeni bir hesaplanmış sütun eklemek istediğimizde, Power BI hem Kategori hem de Alt Kategori tablolarındaki tüm sütunları görebiliyor.
Arada kaç tane ilişki olursa olsun, hem RELATED, hem de RELATEDTABLE, ilişkiler boyunca olan tüm tabloların farkındadır.
Kategori = RELATED ('Ürün Kategorileri'[Kategori] )
Alt Kategori = RELATED ('Ürün Alt Kategorileri'[Alt Kategori] )
Yukarıdaki gibi formüllerle, Ürünler tablosuna göre “one” tarafındaki tablolardan dilediğimiz sütun değerlerini getirebiliriz.
** Hesaplanmış sütunların ilgili her bir satır için ayrı ayrı çalıştığını, yani aynı iterator’lar gibi satır bazlı işlem yaptığını tekrarlayayım.
“Satışlar” tablosunda “miktar” bilgisi var sadece, fiyat ya da tutar bilgisi yok. Fakat “Ürünler” tablosunda her bir ürünün fiyatı var. Satış tutarını hesaplamak için ;
Satışlar :=
SUMX ('Satışlar'; 'Satışlar'[Miktar] * 'Ürünler'[Birim Fiyat] )
diyemeyiz, çünkü bir iterator olan SUMX aradaki ilişkinin farkında değil. Farkına varabilmesi için
Satışlar :=
SUMX ('Satışlar';
'Satışlar'[Miktar] * RELATED ('Ürünler'[Birim Fiyat] )
)
diye yazmalıyız kodumuzu.
RELATEDTABLE çok benzer bir mantıkla, fakat bu sefer ilişkinin “one” tarafındaki her bir tekil varlık (entity) için, ilişkinin “many” tarafındaki tablo(lar)da bulunan eşlenik kayıtlara erişmemizi sağlar. Yani fonksiyonun geri döndürdüğü şey bir tablodur, ilgili varlığın eşlenik kayıtlarını içeren bir tablo.
“Kategoriler” tablosuna her bir kategoride kaç tane ürün olduğunu getirmek istiyoruz diyelim:
Kategorideki Ürün Sayısı = COUNTROWS ( RELATEDTABLE ('Ürünler') )
DAX Man’in kurduğu cümleler şöyle:
- Kategoriler tablosundaki her bir satır için, ilişkiler üzerinden “Ürünler” tablosuna atlayacağım
- Bulunduğum satırdaki “Kategori” ye ait ürünleri “Ürünler” tablosunda bulup filtreleyeceğim
- Bulduğum ürünleri sayıp ilgili kategori satırına ekleyeceğim.
- Kategoriler tablosundaki tüm satırlar için aynı işlemi tekrarlayacağım.
Her bir kategori için satışların miktarını ve tutarını birer hesaplanmış sütun olarak bulalım:
Kategori Satışlar Miktar =
SUMX ( RELATEDTABLE ( 'Satışlar' ); 'Satışlar'[Miktar] )
Kategori Satışları =
SUMX ( RELATEDTABLE( 'Satışlar' ) ;
'Satışlar'[Miktar] * RELATED( 'Ürünler'[Birim Fiyat] )
)
Yazıyı özetlemek gerekirse: RELATED ile ilişkinin “one” tarafında olan bir tablodaki sütun değerine, RELATEDTABLE ile de ilişkinin “many” tarafındaki tablonun ilişkili satırlarına ulaşırız.
Hocam selamlar olsun.Emeginize gore sonsuz tesekkur ederim.Bir soru uzerinde dusunuyorum , bu yuzden desteginze ihtiyyacim vardir.
Neden bir tabloda calculated column olusturan zaman :
Countrows ( [Column] ) – dedigimiz zaman her satir icin toplam say ,
Countrows ( Related[ Column]) her satir icin degerleri hesaplar ?
Tesekkur ederim.
Satır bazlı işlem yapan, yani row context yaratan konseptler (hesaplanmış sütunlar, iterator fonksiyonlar) ilişkilerin farkında değildir, sadece bulundukları tablonun sütun değerlerinin farkındadır. RELATED kullanmazsanız -ilişkinin farkında olmadığı için- her bir satır için işlem yaparken diğer tablodaki sütunun tamamını görür, dolayısıyla her bir satır için aynı rakamı döndürür. RELATED kullandığınızda, bulunduğu satırdaki entity neyse diğer tabloda bunun ilgili kayıtlarını görür. İlgili, adı üstünde RELATED.
Context transition yazısına göz atın. https://powerbi.istanbul/context-transition/