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.