Dax'a Giriş

DAX, Power BI'ın veri modeli oluşturma dilidir. İsim olarak  Data Analytic EXpressions  teriminden türetilmiştir.

DAX, veriler üzerinde bize lazım olan hesaplamaları yaparken kullandığımız, yazım formatı son derece temiz, belli konseptler üzerinde çalışan, bazen hem Excel'e hem de SQL'e benzeyen ama ikisi de  olmayan , syntax ezberlemeyi  gerektirmeyen  oldukça elegan bir dil.

Excel kullanıcılarının PBI ile çalışırken hatırlamaları gereken en önemli fark; Excel'de hücreye referans verilebilirken,   PBI'da sadece tabloya ve/veya sütuna referans verilmesidir.  

Diğer bir değişle, yazacağınız tüm DAX formüllerinde, ya tablo ismi çağırırsınız, ya da tablo+sütun ismi çağırırsınız.

Yukarıdaki gibi bir "Satışlar" tablomuz olsun. Toplam satış tutarını bulmak için aşağıdaki formülleri yazabiliriz.

 "New Measure"  butonunu tıklayıp her iki formülü de ayrı ayrı yazalım:

Satışlar := SUM ('Satışlar'[Tutar])
Satışlar-2 := SUMX ('Satışlar';'Satışlar'[Fiyat] * 'Satışlar'[Miktar])

İlk formülün DAX dilinde açılımı şu: "Satışlar" tablosundaki "Tutar" sütununu bul,  bu sütunda gördüğün  tüm rakamları topla.

İkinci formül ise: "Satışlar" tablosuna git, bu tabloda  gördüğün tüm satırlardaki  "Fiyat" ve "Miktar" sütunlarını her bir satır için tek tek çarp, sonra hepsini topla.

Yukarıdaki formüllerin ikisi de aynı sonucu verir, fakat cümlelerin "DAX" tarafından farklı yorumlandığına dikkatinizi çekerim.

Formülü bir aşama daha geliştirelim:

Fiyatı 3000 den Yüksek Olan Ürünlerin Satışları :=
SUMX (
    FILTER ( 'Satışlar'; 'Satışlar'[Fiyat] > 3000 );
    'Satışlar'[Fiyat] * 'Satışlar'[Miktar]
)

Açıklamayı okumadan önce lütfen formülün nasıl çalıştığının cümlesini kendiniz kurmaya çalışın!

Dax'ın formülü okuması!
"Satışlar" tablosuna git,  gördüğün satırlarda  fiyat sütunu değeri 3000'den büyük olan bütün satırları tek tek bul, bulduğun her bir satır için Fiyat ve Miktar sütunlarını çarp, sonra hepsini topla!

Tüm cümlelerde  "gördüğün"  tabirini kullanmam muhtemelen dikkatinizi çekmiştir. Bu konuya daha sonra bakacağız, önemli bir konseptin parçası çünkü.

Şimdi bir aşama daha ileriye gidelim: Satışlarımızın tamamında 10% indirim yaptığımızı varsayalım, bu durumu nasıl hesaplayacağız?

İndirimli Satışlar := [Satışlar] * 0,9
İndirimli Satışlar-2 := [Satışlar-2] * 0,9

Yukarıdaki  her iki formül de  bize satışların 10% indirimli halini verir!  Buradaki önemli nokta formülleri baştan yazmak zorunda olmadığımızdır. DAX ile yazdığımız formüller  "portable" 'dır. Yani taşınabilir.

Peki formülleri sıfırdan yazarsak ne olur? Yani ;

İndirimli Satışlar-3 := SUM ('Satışlar'[Tutar]) * 0,9
İndirimli Satışlar-4 := SUMX ('Satışlar';'Satışlar'[Fiyat] * 'Satışlar'[Miktar]) * 0,9

Bu formüller de, aynen üsttekiler gibi bize aynı sonucu verirler! 4 farklı formülle aynı rakama ulaştık!

Yukarıda yazdığımız formüllerin hepsi birer  "measure"  'dır. "Ölçü" veya "metrik" de diyebiliriz. PBI terminolojisinde önemli kavramlardan birini böylece isimlendirmiş olduk.

Satışların 10% indirimli halini hesaplamanın bir başka yolunu muhtemelen soruyu ilk sorduğumda da farkettiniz: her bir satırdaki "Tutar" değerini 0,9 ile çarparak yeni bir sütun oluştursak ve bu yeni sütundaki değerleri toplarsak gene aynı sonuca varırız!

Bunu yapmak için, "Satışlar" tablosu seçiliyken sağ tıklayıp çıkan menüden "New Column" seçeneğini veya "Modelling" tabından "New Column" butonunu tıklayın.

İndirimli Tutar := 'Satışlar'[Tutar] * 0,9

10% indirimli yeni tutarları içeren "İndirimli Tutar"  sütununu  oluşturduk. Bu yeni sütundaki değerleri toplarsak yukarıdaki measure'larla aynı değeri elde ederiz.

İndirimli Tutar-5 := SUM ('Satışlar'[İndirimli Tutar])

Tabloda  daha önce olmayan , formül yazarak oluşturduğumuz "İndirimli Tutar" sütunu, bir  "calculated column"  'dur. Yani hesaplanmış sütundur. Böylelikle ikinci bir kavramı daha isimlendirdik.

"Measure" ve "calculated column" 'lar, DAX komutları kullanarak oluşturduğumuz temel kavramlardan en önemlileri. İkisi arasındaki farklılıklar başka bir blog yazısı konusu.

DAX komutlarını kullanarak oluşturduğumuz iki farklı kavram daha var: biri  "calculated tables" , diğeri ise  "row level security" .

Calculated tables, ya da hesaplanmış tablolar, DAX komutları kullanarak mevcut tablolardan  yeni tablolar  türetebilmemizi sağlar. Örneğin yukarıda fiyatı 3000'den yüksek olan satırların toplam satışlarını hesaplamıştık. Fiyatı 3000'den yüksek olan satırlar için ayrı bir tablo yapmak istersek "calculated table"'ı kullanabiliriz.

"Modelling" tabından "New Table" seçip aşağıdaki formülü yazalım:

Fiyatı 3000 den Yüksek Olan Satırlar := FILTER ( 'Satışlar'; 'Satışlar'[Fiyat] > 3000 )

Bu durumda, mevcut "Satışlar" tablosundaki Fiyat sütunu değeri 3000'den yüksek olan satırları içeren  yeni bir tablo  oluşur.

Fiyatı 3000'den yüksek olan satırların toplamını bir de bu tablo üzerinden hesaplayalım:

Fiyatı 3000 den Yüksek Olan Satışlar-2 := SUM ('Fiyatı 3000''den Yüksek Olan Satırlar'[Tutar])

Bir önceki formülle hesapladığımız rakamla aynı sonuca, bu kez "calculated table" oluşturarak ulaştık.

DAX komutlarının kullanıldığı son kavram, "row level security". RLS, aynı rapora erişen farklı kullanıcılara farklı verileri, sonuçları göstermek için kullanılır. Diyelim 10 farklı bölge müdürü varsa, tek bir satış rapor seti yapıp, her bir bölge müdürünün sadece kendi sorumluluğundaki bölgeye ait metrikleri görmesini sağlayabiliriz. RLS ile ilgili detaylar da ayrı bir blog yazısı olacak.

Özetlemek gerekirse; PBI'da DAX'ı kullandığımız dört farklı alan var:

  • Measure 'lar (Ölçüler, metrikler)
  • Calculated Column 'lar (Hesaplanmış Sütunlar)
  • Calculated Table 'lar (Hesaplanmış Tablolar)
  • Row Level Security (RLS)

Measure ve calculated colum, PBI'ın veri modelini oluşturan en önemli kavramlardan ikisi. Hangi durumlarda hangisinin tercih edilmesi gerektiği ve mantığı üzerine daha sonra detaylı bir yazı yazacağım. Bu yazının konularını içeren PBI dosyasını aşağıdaki linkten indirebilirsiniz.

DAX Intro PBIX

* DAX'a giriş yazısı olduğu için şu an için çok önemi yok ama, gene de bir dipnot olarak geçeyim: Yukarıda "İndirimli Satışları" hesapladığımız 4 ayrı formül aynı sonucu verse de, bir metriği doğrudan çağırmakla (ilk iki İndirimli Satışlar formülleri) , formülü sıfırdan yazmak arasında (son iki İndirimli Satışlar formülleri) nüans vardır. Her zaman aynı sonuçları vermeyebilir.