FILTER: satır satır koşul
Büyük Satırlar = CALCULATE([Toplam Satış], FILTER(Satislar, Satislar[Tutar] > 2000))
FILTER(tablo, koşul) koşulu her satırda test eder ve geçen satırlardan bir tablo döndürür. Basit sütun koşullarında boolean filtre (Satislar[Kanal] = "Web") daha hızlıdır. FILTER, koşul bir ölçüye ya da birden çok sütuna dayandığında gerekir:
Çok Satan Ürün Sayısı = COUNTROWS(FILTER(Urunler, [Toplam Satış] > 50000))
ALL ailesi
| Fonksiyon | CALCULATE içinde ne yapar? |
|---|---|
ALL(Tablo) / REMOVEFILTERS(Tablo) | Tablonun ve genişletilmiş tablosunun (bire tarafındaki tablolar) filtrelerini kaldırır |
ALL(Tablo[Sütun]) | Yalnızca o sütunun filtresini kaldırır |
ALLEXCEPT(Tablo, Tablo[Sütun]) | Belirtilen sütun dışındaki tüm filtreleri kaldırır |
ALLSELECTED(...) | Görselin satır/sütun filtrelerini kaldırır ama dilimleyici seçimlerini korur |
Üç farklı pay
Genel Pay % = DIVIDE([Net Satış], CALCULATE([Net Satış], ALL(Kategoriler))) Seçime Göre Pay % = DIVIDE([Net Satış], CALCULATE([Net Satış], ALLSELECTED(Kategoriler))) Kategori İçi Pay % = DIVIDE([Net Satış], CALCULATE([Net Satış], ALL(Urunler[Urun])))
- Genel pay: Dilimleyicide yalnızca 3 kategori seçilse bile payda tüm kategorilerdir; yüzdeler 100'e tamamlanmaz.
- Seçime göre pay: Payda yalnızca seçili kategorilerdir; görseldeki yüzdeler 100'e tamamlanır.
- Kategori içi pay: Satırda ürün varken, ürün filtresi kalkar ama kategori filtresi kalır: ürünün kendi kategorisindeki payı.
Kategoriler[Kategori] ile grupluyorsan, paydada da Kategoriler filtresini kaldırmalısın. ALL(Urunler[Kategori]) yazarsan görselin filtresi (Kategoriler'den geliyor) yerinde kalır ve her satırda %100 görürsün. Bu modelde iki kategori sütunu var: raporda ve alıştırmalarda eksen hep Kategoriler[Kategori]; Urunler[Kategori] ilişki anahtarıdır ve Playground’un alan listesinde gösterilmez.Genişletilmiş tablolar: ALL(Satislar) neden kategori filtresini de siler?
DAX’ta bir olgu tablosu, ilişkili olduğu boyut tablolarının sütunlarını da “içerir”. Buna genişletilmiş tablo denir: Satislar, çoktan bire ilişkiler üzerinden Urunler, Musteriler ve Tarih sütunlarını da kapsar. Bu yüzden:
Tüm Satışlar = CALCULATE([Net Satış], ALL(Satislar))
kategori kırılımında her satırda 1.250.772 ₺ (genel toplam) verir. Kategori filtresi Urunler tablosunda olduğu halde ALL(Satislar) onu da kaldırır, çünkü Urunler[Kategori] genişletilmiş Satislar tablosunun bir parçasıdır. Tersi doğru değildir: ALL(Urunler) ürün tablosunun ve onun genişletilmiş tablosunun (bire tarafındaki Kategoriler) filtrelerini siler; çok tarafındaki Satislar[Kanal] filtresi yerinde kalır.
Kanal Filtresiz Satış = CALCULATE([Net Satış], ALL(Satislar[Kanal]))
Tek bir sütunu hedeflemek ise genişletmeye girmez: yukarıdaki ölçü yalnızca kanal filtresini kaldırır; kategori, tarih ve müşteri filtreleri korunur. Pratik kural: tüm tabloyu değil, kaldırmak istediğin sütunu ya da boyut tablosunu hedefle. Niyetini en açık gösteren yazım REMOVEFILTERS(Urunler) gibi boyut tablosunu adıyla anmaktır.
ALLSELECTED ve görselin toplamı
Kategori müdürü dilimleyicide yalnızca Elektronik, Kitap ve Spor’u seçti. Pasta grafiğinde payların 100’e tamamlanmasını bekliyor. Hazır [Kategori Payı %] ölçüsü ise şunu gösteriyor:
| Kategori | [Net Satış] | [Kategori Payı %] (ALL) | Seçime göre pay (ALLSELECTED) |
|---|---|---|---|
| Elektronik | 339.304 ₺ | %27,1 | %50,2 |
| Kitap | 151.882 ₺ | %12,1 | %22,5 |
| Spor | 184.231 ₺ | %14,7 | %27,3 |
| Toplam | 675.417 ₺ | %54,0 | %100 |
İki ölçü de doğru; farklı sorulara cevap veriyorlar. ALL(Kategoriler) paydaya tüm şirketi koyar: “Elektronik, şirketin %27’si.” ALLSELECTED(Kategoriler) ise görselin kendi satır filtresini kaldırır ama dilimleyici gibi dışarıdan gelen filtreleri korur. Payda 675.417 ₺ olur: “Seçtiğin üç kategorinin yarısı Elektronik.”
Seçili Kategoriler İçinde Pay % = DIVIDE([Net Satış], CALCULATE([Net Satış], ALLSELECTED(Kategoriler)))
Paydayı kurarken hangi filtre kalıyor?
Şimdi dilimleyicide kategori değil, Kanal = Web seçili olsun. Satırlarda kategoriler var. Paydayı üç farklı şekilde kurarsan:
| Payda | Ne kaldırılır? | Elektronik | Okunuşu |
|---|---|---|---|
ALL(Kategoriler) | Yalnızca kategori | %28,6 | Web satışları içinde Elektronik’in payı |
ALL(Satislar) | Kategori, kanal, tarih, müşteri… hepsi | %10,5 | Web’deki Elektronik, şirketin tüm satışlarının yüzde kaçı? |
ALLSELECTED(Kategoriler) | Görselin kategori filtresi | %28,6 | Kategori seçimi olmadığı için ALL ile aynı |
Dilimleyicinin kanal filtresi ALL(Satislar) ile de silinir, çünkü Satislar[Kanal] olgu tablosundadır ve genişletilmiş Satislar bütün boyutları kapsar. Kullanıcı “Web’i seçtim, neden paydada Web yok?” diye sorarsa ilk bakacağın yer burasıdır.
Zaman içinde pay
Pay her zaman kategoriyle ilgili değildir. Finans ekibi iki soru soruyor: “Aralık, yılın yüzde kaçı?” ve “2024, üç yılın yüzde kaçı?”
Yıl İçi Ay Payı % = DIVIDE([Net Satış], CALCULATE([Net Satış], ALLEXCEPT(Tarih, Tarih[Yil]))) Tüm Yıllara Göre Pay % = DIVIDE([Net Satış], CALCULATE([Net Satış], REMOVEFILTERS(Tarih)))
Aralık 2024 yılın %7,5’i; 2024 ise tüm dönemin %59,7’si. Yıl içi payda ALL(Tarih[YilAy]) yazmak da yalnız ay sütunu varken aynı sonucu verir. Ama matrise Tarih[Ay] ya da Tarih[Ceyrek] eklenince o filtreler yerinde kalır ve paylar bozulur. ALLEXCEPT(Tarih, Tarih[Yil]) “yıl dışındaki tüm tarih filtrelerini kaldır” dediği için daha sağlamdır.
Hiyerarşide ebeveyne göre pay
Kategori → Ürün hiyerarşisi olan bir matriste her düzey kendi ebeveynine göre pay göstersin: ürün satırında kategorinin yüzde kaçı, kategori satırında şirketin yüzde kaçı.
Ebeveyn Payı (Hiyerarşi) =
SWITCH(
TRUE(),
ISINSCOPE(Urunler[Urun]), DIVIDE([Net Satış], CALCULATE([Net Satış], ALL(Urunler[Urun]))),
ISINSCOPE(Kategoriler[Kategori]), DIVIDE([Net Satış], CALCULATE([Net Satış], ALL(Kategoriler)))
)
Sıra önemlidir. Ürün satırında hem ürün hem kategori kapsamdadır. Bu yüzden en derin düzey önce denenir. 27" Monitör, Elektronik’in %30,1’i; Elektronik de şirketin %27,1’i. Toplam satırında hiçbir koşul doğru olmadığı için ölçü BLANK döner. %100 göstermek anlamsız olacağından bu bilinçli bir tercihtir.