DAX’ta SUMMARIZE() Fonksiyonu

SUMMARIZE(), DAX’ta sıklıkla kullanılan bir gruplama fonksiyonudur. Hem tablo sonucu verebilir hem de ölçüler içerisinde tablo başvurusu olarak kullanılabilir. Aynı tablodan ya da ilişkili tablolardan gelen bilgileri özetlemek için idealdir. Bugünkü yazımızda SUMMARIZE() fonksiyonu söz dizimi, ADDCOLUMNS() fonksiyonuyla beraber kullanımı, FILTER() fonksiyonuyla beraber kullanımı ve bazı ip uçlarını ele alıyoruz. Hazırsanız söz dizimini Contoso üzerinden bir örnekle göstererek başlayalım..

SUMMARIZE(
	Sales, --özetlenecek tablo
	Geography[RegionCountryName], --Tablonun ilk sütunu
	'Product'[ClassName], --Tablonun ikinci sütunu
	"Satış Tutarı", [Satış Döviz Tutarı] --Yeni sütun adı ve yeni sütun formülü
)


SUMMARIZE() ülke adı ve sınıf olarak gruplama yapabilmek için, clustering adı verilen işlemi gerçekleştirerek tabloyu partisyonlara (bölümlere) ayırır. Ülke adı ve sınıf adına göre sütun setini oluşturur. Ardından filtre bağlamı ile sonucu hesaplar. SUMMARIZE() fonksiyonu içerisinde hesaplama sütunu oluştururken bağlam geçişine ihtiyaç yoktur. Ölçü çağırmak yerine başına CALCULATE() dahi eklemeden, çalışan bir sütun formülü yazılabilir. Yine de bir hesaplama sütunu eklenmesi gerektiğinde, bu yaklaşımın yerine SUMMARIZE() ile ADDCOLUMNS() fonksiyonlarını beraber kullanmak en iyi pratiktir (best practise). 

En iyi pratik SUMMARIZE() ve ADDCOLUMNS() beraber kullanımı

Örneğimizde söz dizimini anlatmak için Satış Tutarı sütununu SUMMARIZE() içerisinde oluşturarak ölçüyü çağırdık. SUMMARIZE() fonksiyonu hem filtre bağlamını hem satır bağlamını aynı anda kullanabilen özel bir fonksiyon. Ancak her ikisini beraber kullanmak performans açısından sorunlara yol açabiliyor. Performans açısından en iyi pratik, toplam sütunu oluştururken ADDCOLUMNS() fonksiyonundan yararlanmak. Özellikle büyük veri setlerinde önemli zaman kazancı sağlayan bu pratiği bir örnekle gösterelim. 

EVALUATE

VAR TabloSummarize=

	SUMMARIZE(
		Sales,
		Geography[RegionCountryName],
		'Product'[ClassName]
	)

VAR TabloAddcolumns =

	ADDCOLUMNS(
		TabloSummarize,
		"Satış Tutarı", [Satış Döviz Tutarı]
	)

RETURN TabloAddcolumns

SUMMARIZE() fonksiyonunu ülke adı ve sınıf adı sütunlarını gruplamak için kullandık. Arından ADDCOLUMNS() kullanarak, gruplanan sütunlara ilave sütun ekledik ve satır bağlamına [Satış Döviz Tutarı] ölçüsünü çağırdık.

SUMMARIZE() ve ADDCOLUMNS() Hesaplamalarında Bağlam Geçişi

İlk örneğimizde SUMMARIZE() içerisinde oluşturduğumuz hesaplama sütununa, bağlam geçişini tetikleme ihtiyacı duymadan, doğrudan formül yazabileceğimizi belirtmiştik. ADDCOLUMNS() eklendiğinde ise bağlam geçişine ihtiyaç duyulmaktadır.

Önceki yazılardan da hatırlayacağımız gibi ölçü tanımında yazılmasa da CALCULATE() oradadır. Bir önceki örnekte ölçü çağırdığımız için, CALCULATE() devreye girerek bağlam geçişini tetikledi ve sorunla karşılaşmadık. Aynı örnekte ölçüyü çağırmak yerine formülü yazmak istediğimizde bağlam geçişinin gerçekleşmesi için CALCULATE() eklememiz yeterli.

EVALUATE

VAR TabloSummarize=

	SUMMARIZE(
		Sales,
		Geography[RegionCountryName],
		'Product'[ClassName]
	)

VAR TabloAddcolumns =

	ADDCOLUMNS(
		TabloSummarize,
		"Satış Tutarı",  
					CALCULATE(
						  SUMX(
			   				  Sales, 
			   				  Sales[SalesQuantity] * Sales[UnitPrice]
						  )
					)
	)

RETURN TabloAddcolumns

Bağlam geçişi konusuna önceki yazımızda değinmiştik. Okumak isterseniz buradan ulaşabilirsiniz.

DAX’ta Bağlamlara Giriş 3: Context Transition (Bağlam Geçişi) nedir

SUMMARIZE() VE FILTER() fonksiyonlarının beraber kullanımı

Ülke adı ve ürün sınıfına göre satış tutarlarını oluşturan bir tablo yazmak üzerine konuştuk. Diyelim ki bu tabloyu filtreleyerek yalnızca

  • Amerika, Japonya, İngiltere ülkelerindeki ve (&&)
  • Ekonomi ile orta sınıf ürünlerin satış tutarlarını görmek istiyoruz.

Tek yapmamız gereken, yukarıda oluşturduğumuz özet tablonun devamına bu iki filtreyi eklemek:

EVALUATE

VAR TabloSummarize=

	SUMMARIZE(
		Sales,
		Geography[RegionCountryName],
		'Product'[ClassName]
	)

VAR TabloAddcolumns =

	ADDCOLUMNS(
		TabloSummarize,
		"Satış Tutarı",  
					CALCULATE(
						SUMX(
			   				Sales, 
			   				Sales[SalesQuantity] * Sales[UnitPrice]
						)
					)
	)
	
VAR TabloAddcolumnsFiltre =

	FILTER(
		TabloAddcolumns,
		[RegionCountryName] IN { "Japan", "United States", "United Kingdom"} &&
		[ClassName] IN {"Economy", "Regular"}
		
	)

RETURN TabloAddcolumnsFiltre

CALCULATE() modifiye eden fonksiyonları doğrulamak için kullanımı

İki tablodaki sonuçları karşılaştırmak kolaydır ancak tek tabloyu kontrol etmek zordur. Özellikle öğrenme aşamasında, tercihen her zaman, ölçülerin doğru çalıştığını test etmek oldukça önemli. DAX nüanslarla dolu ve atlanan bir detay, sonuçların veya toplamların, beklenenin dışında sonuçlar vermesine kolaylıkla neden olabilir. Filtre bağlamında oluşturulan ölçülerin sonuçlarını kontrol etmek için, aynı sonucu farklı yöntemle elde eden farklı bir tablo oluşturmak ve karşılaştırma yapmak, varsa sorunların tespiti için önemli bir araç olabilir.

ALL(), ALLEXCEPT(), REMOVEFILTERS(), KEEPFILTERS() gibi CALCULATE() modifiye eden fonksiyonların kullanıldığı ölçüleri test etmek için SUMMARIZE() ve SUMMARIZECOLUMNS() fonksiyonları kullanılabilir. Her ikisi de yazılan ölçünün kullanıldığı tabloyu simule etmeye olanak tanıyan, dolayısıyla ölçüleri test etmek ve karşılaştırmak için kullanılabilecek iki harika fonksiyon. SUMMARIZE()’ın SUMMARIZECOLUMNS()’a göre en önemli avantajı, tablo döndürmekle kısıtlı olmayıp aynı zamanda ölçü içerisinde de tanımlanabilmesi olduğunu da not düşelim.

Bugün DAX’ın en güçlü fonksiyonlarından olan SUMMARIZE() fonksiyonundan bahsettik ve diğer fonksiyonlarla beraber kullanımına kısaca değindik. Bir sonraki yazıda görüşmek üzere. DAX’la kalın..