ALL + VALUES vs ALLEXCEPT

Önceki yazının tamamlayıcısı olarak, birbirine yakın gibi duran ama iki farklı kalıbı karşılaştıralım: ALL + VALUES ile ALLEXCEPT arasındaki farklar ve benzerliklere değinelim. Kullandığımız yere göre her iki kalıp da zaman zaman aynı sonucu verebilir ama semantikleri tamamen farklı.

Aşağıdaki gibi iki metriğimiz var:

Tüm Satışlar := CALCULATE( [Satışlar] ; ALL('Tarih') )
Tüm Satışlar_VALUES := CALCULATE( [Satışlar] ; ALL('Tarih') ; VALUES( 'Tarih'[Yıl] ) )


[Tüm Satışlar] metriğine ALL('Tarih') ile Tarih tablosundaki tüm filtreleri kaldır dedik, dolayısıyla aktif filter context'teki tarih ne olursa olsun tüm tarihleri görüyor.

VALUES( 'Tarih'[Yıl] ) ile modifiye ettiğimiz ikinci metrikte ise, tüm tarih tablosunu gör VE gördüğün context'teki  yıl değişirse  buna riayet et dedik.  Aynı matrise ay seviyesinde bakalım:


2007 yılına ait satırlar için konuşmak gerekirse: tüm tarih tablosuna bak VE yıl 2007 olacak, yıl değişirse bu değişikliğe riayet et! İlgili ayların yılı aynı, yıl değişmiyor, dolayısıyla 2007'deki her bir ay satırı çin aynı şeyi hesaplıyor: 2007'deki satışlar! Aynı cümleleri diğer yıl/ay için de kurabiliriz.

ALLEXCEPT ile bir metrik daha ekleyelim ve matrise düşürelim:

Tüm Satışlar_ALLEXCEPT := 
CALCULATE( [Satışlar] ; ALLEXCEPT( 'Tarih' ; 'Tarih'[Yıl] ) )


ALLEXCEPT( 'Tarih' ; 'Tarih'[Yıl] ) ile Tarih tablosundaki aktif tüm filtreleri kaldır,  yıl hariç , yani yıl değişirse buna riayet et!

Her ikisi de, yani hem VALUES hem de ALLEXCEPT versiyonları aynı gibi gözüküyor. Hem yıl seviyesinde hem de ay seviyesinde aynı gibiler!

Tarih tablomuzdaki sütunlardan biri Yıl-Ay No kombinasyonunu içeriyor. 2007-1, 2007-2 vs diye gidiyor.


Bu sütun üzerinden aşağıdaki metrikleri ekliyorum:

Tüm Satışlar_VALUES_Yıl-Ay := 
CALCULATE( [Satışlar] ; ALL('Tarih') ; VALUES( 'Tarih'[Yıl-Ay] ) )
Tüm Satışlar_ALLEXCEPT-Yıl-Ay := 
CALCULATE( [Satışlar] ; ALLEXCEPT( 'Tarih' ; 'Tarih'[Yıl-Ay] ) )

Cümleleri benziyor: tüm tarih tablosuna bakacaksın VE  Yıl-Ay değişirse  buna riayet edeceksin!

Aşağıdaki matrise her ikisini de düşürelim:

Yukarıda yaptığımız örneklere benzer şekilde hala aynı gibi gözüküyorlar ama değiller! Matristen  Yıl-Ay sütununu çıkardığımız anda  farklılaşacaklar!

ALLEXCEPT( 'Tarih' ; 'Tarih'[Yıl-Ay] ), eğer Yıl-Ay sütunu üzerinde  doğrudan direkt bir filtre varsa bunu kaldırıyor ! Matriste Yıl-Ay varken her bir değişimde ilgili Yıl-Ay'daki satışları gösterirken, Yıl-Ay sütununu matristen kaldırdığımızda gösterdiği şey tüm satışlar! Çünkü artık Yıl-Ay sütunu üzerinden doğrudan direkt bir filtre yok!

Daha önce bahsettiğim ISFILTERED / ISCROSSFILTERED ile bunu kontrol edebiliriz:

Yıl_Ay_ISFILTERED := ISFILTERED( 'Tarih'[Yıl-Ay] )


Her bir satırda Yıl-Ay sütunu üzerinde doğrudan bir filtre varken (ISFILTERED True dönüyor) Toplam (Total) satırında doğrudan bir filtre yok, ISFILTERED False dönüyor!

Matristen Yıl-Ay sütununu kaldırdığımızda  hepsi False dönüyor , yani artık Yıl-Ay sütununda  doğrudan direkt bir filtre yok !

Yıl-Ay sütunu üzerinde dolaylı, endirekt bir filtre var, o da  matristeki Yıl ve Ay sütunlarından geliyor . Başka bir deyişle, Yıl-Ay sütunu üzerindeki dolaylı filtre Yıl ve Ay sütunlarından gelen cross-filter!

Aşağıdaki metriği de ekleyelim ve görelim:

Yıl-Ay_ISCROSSFILTERED := ISCROSSFILTERED( 'Tarih'[Yıl-Ay] )


VALUES( 'Tarih'[Yıl-Ay] ), ALLEXCEPT'in aksine, dolaylı da olsa Yıl-Ay üzerindeki crossfilter'ı görüyor! Yıl-Ay sütununun matriste olmasına gerek yok, ayrı ayrı Yıl ve Ay sütunlarından gelen etkiyi görebiliyor.

** ISCROSSFILTERED ile yazdığımız metrik Toplam satırında  niye False dönüyor  düşünmekte fayda var. ISFILTERED yazısına tekrar bakmanızı önereceğim.

Ara ara çalışan metrikler yerine her zaman istediğimiz gibi çalışan metrikler yazmak için context/filter context kavramları üzerinde ciddi anlamda durmak gerekiyor. Fonksiyonlar arasında ufakmış-önemsizmiş gibi gözüken farklar bazen yazdığımız formüllerin sonucunu radikal bir biçimde değiştirebiliyor.

Yazıdaki modeli indirebilirsiniz.

Sadece kayıtlı üyeler görebilir. Giriş veya Üyelik için login.