Filtre bağlamı: “Şu an hangi satırlar görünüyor?”
Bir matriste satıra Kategoriler[Kategori], sütuna Tarih[Yil], değere [Toplam Satış] koyduğunu düşün. “Kitap / 2024” hücresi hesaplanırken Power BI şunu yapar:
- Hücrenin koordinatlarından filtreler çıkarır:
Kategori = "Kitap",Yil = 2024. - Dilimleyici, sayfa ve rapor filtrelerini ekler (ör.
Kanal = "Web"). - Filtreleri ilişkiler üzerinden
Satislartablosuna yayar. SUM(Satislar[Tutar])'ı yalnızca kalan satırlar üzerinde hesaplar.
Bu filtrelerin tümüne filtre bağlamı denir. Formül hiç değişmez; değişen, formülün gördüğü satırlardır. Toplam satırında kategori filtresi yoktur, bu yüzden toplam tüm kategorileri kapsar.
SUM(Satislar[Tutar]) yaz ve satır eksenini Kategori, sonra Yıl, sonra Kanal yap. Aynı formül, farklı bağlam.Satır bağlamı: “Şu an hangi satırdayım?”
Hesaplanmış sütunlarda ve SUMX gibi yineleyicilerde (iterator) DAX tablonun satırlarını tek tek dolaşır. Her adımda “geçerli satır” vardır; Satislar[Adet] yazdığında o satırın adedini okursun.
Brüt Tutar = SUMX(Satislar, Satislar[Adet] * Satislar[BirimFiyat])
SUMX, filtre bağlamında görünen her satış satırı için Adet × BirimFiyat hesaplar ve sonuçları toplar.
İkisi aynı şey değil
| Filtre bağlamı | Satır bağlamı | |
|---|---|---|
| Kaynağı | Görsel, dilimleyici, filtreler, CALCULATE | Hesaplanmış sütun, X ile biten fonksiyonlar, FILTER |
| Etkisi | Tablolardaki satırları süzer | Bir satırın değerlerini okumayı sağlar |
| İlişkileri izler mi? | Evet, kendiliğinden | Hayır; ilişkili tabloya RELATED ile gidilir |
Fiyat Ölçüsü = Satislar[BirimFiyat]. Ölçünün satır bağlamı yoktur; hangi satırın fiyatı? DAX hata verir. Toplayıcı (SUM, AVERAGE, MAX) ya da yineleyici kullan.Toplam satırı neden satırların toplamı değildir?
Matristeki Toplam satırı, üstteki hücreleri toplamaz. Ölçü, toplam satırının kendi filtre bağlamında (yani kategori filtresi olmadan) yeniden hesaplanır. Toplanabilir ölçülerde (SUM gibi) bu fark görünmez; toplanamayan ölçülerde ise toplam, satırların toplamından farklı çıkar.
Müşteri Sayısı (kategori toplamı) = SUMX(VALUES(Urunler[Kategori]), [Müşteri Sayısı])
Bu modelde [Müşteri Sayısı] toplamda 136, ama yukarıdaki ölçü 628 verir. Bir müşteri birden çok kategoriden alışveriş yaptığı için her kategoride yeniden sayılır. Hangisi doğru? Soruya bağlı: “kaç farklı müşterimiz var?” sorusunun cevabı 136’dır. Toplam satırının satırların toplamını göstermesi gerekiyorsa SUMX ile açıkça öyle yazmak gerekir.
Toplam satırında farklı bir şey göstermek (ya da hiçbir şey göstermemek) için hücrenin hangi düzeyde olduğunu sorabilirsin:
Kategori Satışı (yalnızca satırlarda) = IF(ISINSCOPE(Urunler[Kategori]), [Net Satış], BLANK())
Hesaplanmış sütun mu, ölçü mü?
Satış müdürü iki şey istiyor: tabloda her satış satırının kâr marjı, kartta da “ortalama marjımız”. Hızlı çözüm şuna benzer: Satislar tablosuna bir hesaplanmış sütun (calculated column) eklenir, karta da bu sütunun ortalaması konur.
Satır Marjı = DIVIDE(Satislar[Tutar] - Satislar[Maliyet], Satislar[Tutar])
Sütun, yenileme sırasında her satır için bir kez hesaplanır. Bu bir satır bağlamı işidir ve sorun çıkarmaz. Sorun karttadır. Sütunun ortalaması her satırı eşit sayar: 50 ₺’lik bir kitap satırı ile 5.000 ₺’lik bir monitör satırı ortalamayı aynı ölçüde etkiler. Aynı hesabı ölçü olarak yazınca farkı görürsün:
Satır Marjı Ortalaması =
AVERAGEX(
FILTER(Satislar, Satislar[Durum] <> "İptal"),
DIVIDE(Satislar[Tutar] - Satislar[Maliyet], Satislar[Tutar])
)
Bu modelde satır ortalaması %35,9 çıkar; hazır [Kâr Marjı %] ise %36,5. Fark kategori düzeyinde daha da açılır, üstelik yönü bile değişir:
| Kategori | [Kâr Marjı %] (toplam kâr / toplam satış) | Satır marjlarının ortalaması |
|---|---|---|
| Elektronik | %38,0 | %36,9 |
| Kozmetik | %35,1 | %37,9 |
| Tüm satışlar | %36,5 | %35,9 |
Kozmetikte küçük tutarlı satırların marjı yüksek, büyük tutarlı satırlarınki düşük. Satır ortalaması bu yüzden kategoriyi olduğundan iyi gösterir. Yöneticinin sorduğu “kazandığımız her 100 ₺’nin kaçı kâr?” sorusunun cevabı ilk sütundur.
| Soru | Hesaplanmış sütun | Ölçü |
|---|---|---|
| Ne zaman hesaplanır? | Yenilemede, bir kez | Her görsel sorgusunda, o hücrenin bağlamında |
| Hangi bağlamı görür? | Yalnızca satır bağlamı | Filtre bağlamı (dilimleyici, eksen, filtreler) |
| Bellek | Her satır için değer saklar, modeli büyütür | Saklamaz, yalnızca formül |
| Dilimleyici / eksen olabilir mi? | Evet | Hayır |
| Tipik kullanım | Gruplama etiketi (“Büyük sipariş”), sıralama anahtarı | Toplam, oran, pay, karşılaştırma |
Hesaplanmış sütunda filtre bağlamı yoktur
İkinci klasik tuzak: Urunler tablosuna her ürünün cirosunu yazan bir sütun eklemek.
Ürün Cirosu = SUM(Satislar[Tutar])
Beklenen, her ürün satırında o ürünün cirosu. Gerçekte her satırda aynı sayı çıkar: 1.346.190 ₺, yani bütün satışlar. Sebep şu: hesaplanmış sütunda satır bağlamı vardır ama filtre bağlamı boştur. Satır bağlamı bir filtre değildir; ilişki üzerinden Satislar’a hiçbir şey yaymaz. SUM de filtre bağlamına baktığı için tüm tabloyu toplar.
Formülü CALCULATE içine alınca satır bağlamı bir filtreye dönüşür ve ilişki üzerinden yayılır. Bunun adı bağlam geçişidir; ayrıntısı İleri DAX’taki “Bağlam geçişi” dersinde. Etkisini bir sorguyla görebilirsin:
EVALUATE
ADDCOLUMNS(
TOPN(3, Urunler, Urunler[UrunNo], ASC),
"Ham SUM", SUM(Satislar[Tutar]),
"CALCULATE ile", CALCULATE(SUM(Satislar[Tutar]))
)
Kablosuz Kulaklık, Akıllı Saat ve Bluetooth Hoparlör satırlarında “Ham SUM” hep 1.346.190 ₺ çıkar. “CALCULATE ile” sütunu ise sırasıyla 42.762 ₺, 64.906 ₺ ve 33.032 ₺ verir. Bir ölçü referansı ([Toplam Satış]) yazsaydın, ölçüler kendiliğinden CALCULATE ile sarıldığı için sonuç doğru olurdu.
Bir hücrenin filtre bağlamını okumak
Bazen ölçünün kendi bağlamını bilmesi gerekir: “Toplam satırında mıyım? Kullanıcı kategori seçti mi?” Bunun için dört fonksiyon var ve her biri farklı bir soruya cevap verir:
| Fonksiyon | Sorduğu soru | Toplam satırında, dilimleyicide tek kategori seçiliyken |
|---|---|---|
ISFILTERED(Kategoriler[Kategori]) | Bu sütuna doğrudan bir filtre var mı? | DOĞRU |
HASONEVALUE(Kategoriler[Kategori]) | Görünen tek bir değer mi kaldı? | DOĞRU |
ISINSCOPE(Kategoriler[Kategori]) | Görselin gruplama düzeyi bu sütun mu? | YANLIŞ |
COUNTROWS(VALUES(Kategoriler[Kategori])) | Kaç değer görünüyor? | 1 |
Toplam satırını gizlemek için ISINSCOPE, “tek bir seçim var mı?” sorusu için HASONEVALUE doğru araçtır. İkisini karıştırınca toplam satırı tek seçimde bir kategori gibi davranır. Hangi hücrede hangi cevabın geldiğini görmek için şu tanı ölçüsünü bir matrise koy:
Bağlam Dedektörü =
SWITCH(
TRUE(),
ISINSCOPE(Kategoriler[Kategori]), "Kategori satırı",
ISFILTERED(Kategoriler[Kategori]), "Toplam, kategori filtreli",
"Filtre yok"
)
CALCULATE ya da ölçü referansı kullan. 3) Sonuç bir oran mı? Oransa ölçü yaz, sütunda saklama. 4) Toplam satırında ne görünmeli? ISINSCOPE ile karar ver.