Ana içeriğe geç
Kesit Power BI
Orta · DAX Bağlamları

Filtre bağlamı (filter context) ve satır bağlamı (row context)

Aynı formül neden her hücrede farklı sonuç verir? DAX'ın iki bağlamı.

Uygulamada aç, 8 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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:

  1. Hücrenin koordinatlarından filtreler çıkarır: Kategori = "Kitap", Yil = 2024.
  2. Dilimleyici, sayfa ve rapor filtrelerini ekler (ör. Kanal = "Web").
  3. Filtreleri ilişkiler üzerinden Satislar tablosuna yayar.
  4. 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.

DeneyDAX Playground’da 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, CALCULATEHesaplanmış sütun, X ile biten fonksiyonlar, FILTER
EtkisiTablolardaki satırları süzerBir satırın değerlerini okumayı sağlar
İlişkileri izler mi?Evet, kendiliğindenHayır; ilişkili tabloya RELATED ile gidilir
Sık hataBir ölçüde çıplak sütun yazmak: 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.
Derinleş

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())
KuralBir ölçünün toplamı “yanlış” görünüyorsa önce şunu sor: toplam satırının filtre bağlamı ne? Cevap neredeyse her zaman “görselin satır filtresinin olmadığı bağlam”dır; dilimleyici ve sayfa filtreleri kalır.
Uzmanlaş

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.

SoruHesaplanmış sütunÖlçü
Ne zaman hesaplanır?Yenilemede, bir kezHer 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)
BellekHer satır için değer saklar, modeli büyütürSaklamaz, yalnızca formül
Dilimleyici / eksen olabilir mi?EvetHayır
Tipik kullanımGruplama etiketi (“Büyük sipariş”), sıralama anahtarıToplam, oran, pay, karşılaştırma
Karar kuralıSonucu dilimleyiciye, eksene ya da satır başlığına koyacaksan sütun yaz. Sonucu bir sayı olarak, kullanıcının seçimine göre değişsin istiyorsan ölçü yaz. Oranı, ortalamayı ve payı asla sütunda saklayıp sonra toplama ya da ortalama alma.

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:

FonksiyonSorduğu soruToplam 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"
)
Kontrol listesi: bağlam sorusu1) Formül nerede çalışıyor: hesaplanmış sütun mu, ölçü mü, yineleyicinin içi mi? 2) Satır bağlamı varsa, ilişkili tabloyu süzmesi gerekiyor mu? Gerekiyorsa 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.
Alıştırmalara geç (8)