Power BI’da DAX’e Giriş-Iteratorler “X”

Herkese merhaba,

Power BI’da DAX kullanırken karşımıza çıkan “X” ile biten fonksiyonlardan yani Iterator‘lerden bahsetmek istiyorum.

Power BI’da birden fazla kolonla işlem yapmak gerektiğinde “Iterator” kavramına ihtiyaç duyuyoruz. Iterator satır satır verilerin işlenmesini ve ifade edilmesini sağlıyor. Aslında DAX’e giriş yazımda bahsettiğim gibi VertiPaq motorunun çalışma prensibi kolon bazlıdır. Yani iterator’un çalışma prebsibi, DAX motoru ile ters prensipte. Performans olarak hızlı olmasına rağmen bazı durumlarda kolon bazlı çalışma yeterli olmayabiliyor, bu gibi durumlarda kurtarıcı olarak karşımıza satır bazlı çalışan Iterator’ler çıkıyor. Böylelikle birden fazla kolonda “aggregation” fonksiyonlarının işlenmesini sağlıyorlar.

Genel olarak iteratorler iki parametre ile çalışıyor, birinci parametresi tablo, ikinci parametresi ise kolonlara yapılacak olan işlem yani “ifade (expression)”. Tıpkı filtre fonksiyonu gibi.. Filtre fonksiyonu kullanırken de önce tablo seçip filtreleme ifadesini yazıp kolonlara filtreyi uyguluyoruz ve tablo geri döndürüyoruz. Zaten filtre fonksiyonuda bir iteratordür.

Iteratorler ile birden fazla kolon üzerinde işlem yapılması için ifade (expression) kullanımının gerekliliğinden bahsettiğime göre bu ifadenin nasıl değerlendirildiğinden de bahsedeyim.. Bir ifadenin değerlendirilmesi, ifadenin ne göreceği  evaluation context ile belirlenir. DAX motorunun çalışması ve ifadenin okunmasıyla ilgili 2 tip context vardır:

  • Filter Context: temel olarak verilere uygulanmış tüm filtrelerdir. Filter context ifade kısmını ve measure’ı görebilir.
  • Row Context: Mesela hesaplanmış sütunlar dolaylı olarak row context oluşturur ve row context’ler ifadeyi sınrılarlar.

Toparlarsam, evaluation contextler ifadelerin okunmasını, değerlendirilmesini sağlıyorlar. Iteratorler ise ifadeler yardımıyla birden fazla kolonda aggregation fonksiyonlarının uygulanmasını sağlıyor.

Daha açık ifade etmek için kısa bir örnek yapıyorum. NorthwindDB‘den Categories ve OrdersDetails Tablolarını PowerBI Desktop’ın içine aktarıyorum. Amacım ürün kategorilerinin ortalama satışlarını bulmak.

Öncelikle toplam satış miktarını OrdersDetails tablosundan Quantity*Unitprice*(1-Discount) formülü ile bulup bunun ortalamasını alacağım. Dediğim gibi aynı tabloda bile olsa birden çok kolonla işlem yapıp average fonksiyonu uygulayacağım için Average burada işime yaramayacak ve benden tek bir kolon adı isteyecek, formüle devam ettiğim taktirde hata verecek.

Adsiz1

Average’ı AVERAGEX’e çevirdiğimde ise hata düzelecek ve Ölçümü sorunsuz oluşturacak. Iteratorler fonksiyon adının sonuna “X” ifadesi alırlar. Averagex, sumx, countx, concatenatex gibi.. Ancak yukarıda dediğim gibi filtre bir iterator olduğu için filterex diye bir fonksiyon yok.

Adsiz1

CategoryName’e göre ortalama satış grafiğimi ve tablomu elde ediyorum.

Adsiz1

Iteratorler satır bazlı çalıştıkları için performans açısından kolon bazlı yaklaşıma göre daha düşüktür. Mesela AVERAGEX, AVERAGE fonksiyonundan ya da SUMX, SUM’dan daha düşük performansta çalışır. Iterator kullanmanın avantajı ise veri modelinde calculated column kullanmak istediğiniz durumda alternatif olarak iterator kullanabilirsiniz.

İlgili .pbix dosyasını GitHub’da PowerBI repository’den indirebilirsiniz.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s