Ana içeriğe geç
Kesit Power BI
İleri · İleri Modelleme

Hesaplama grupları, alan parametreleri, görsel hesaplamalar

Ölçü patlamasını önlemek ve kullanıcıya ölçü/boyut seçtirmek.

Uygulamada aç, 10 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ç.

Ölçü patlaması

5 temel ölçün (Satış, Kâr, Adet, Sipariş, Müşteri) ve 6 zaman varyasyonun (Cari, GY, YTD, GY YTD, YoY, YoY %) varsa 30 ölçü yazman gerekir. Hesaplama grupları bu varyasyonları bir kez tanımlar ve her ölçüye uygular.

-- Hesaplama grubu: Zaman Zekâsı, öğeler:
Cari    = SELECTEDMEASURE()
GY      = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(Tarih[Tarih]))
YTD     = CALCULATE(SELECTEDMEASURE(), DATESYTD(Tarih[Tarih]))
YoY %   = VAR c = SELECTEDMEASURE()
          VAR g = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(Tarih[Tarih]))
          RETURN DIVIDE(c - g, g)

SELECTEDMEASURE(), görselde o an kullanılan ölçünün yerine geçer. Hesaplama grubu modelde bir tablo gibi görünür; öğelerini matrisin sütununa koyduğunda her ölçü için altı varyasyon kendiliğinden gelir. Öğeler biçim dizesi ifadesi de taşıyabilir: YoY % öğesi sonucu yüzde olarak gösterir.

Desktop'ta Model görünümünde Hesaplama grubu düğmesiyle (ya da Tabular Editor ile) oluşturulur. Hesaplama grubu eklenince örtük ölçüler kapanır; tüm değerler açık ölçü olmalıdır.

Alan parametreleri

Modelleme → Yeni parametre → Alanlar. Kullanıcıya bir dilimleyiciden “Grafiğin ekseni: Kategori / Kanal / Segment” ya da “Değer: Satış / Kâr / Adet” seçtirirsin. Arka planda özel bir tablo ve NAMEOF fonksiyonu kullanılır.

Görsel hesaplamalar

Görselin kendisinde, yalnızca görseldeki verilerle çalışan DAX hesapları. Model ölçüsü yazmadan kümülatif toplam, hareketli ortalama, önceki satıra göre fark:

Kümülatif = RUNNINGSUM([Net Satış])
Öncekine Göre = [Net Satış] - PREVIOUS([Net Satış])

Görsel hesaplamalar matris ızgarası üzerinde düşünür (satırlar, sütunlar, üst düzey). Model ölçülerinden daha basit yazılır ama yalnızca o görselde yaşar.

Dinamik biçim dizeleri

Ölçü araçları → Biçim → Dinamik. Ölçünün yanında, sonucun nasıl yazılacağını döndüren ikinci bir DAX ifadesi tanımlanır; sonuç sayı olarak kalır (sıralanır, grafikte kullanılır) ama biçimi bağlama göre değişir:

-- [Satış (Seçili Para)] ölçüsünün biçim dizesi ifadesi:
VAR Sembol = SELECTEDVALUE(ParaBirimleri[Sembol], "₺")
RETURN "#,0 " & Sembol

-- Büyüklüğe göre biçim:
SWITCH(TRUE(),
    SELECTEDMEASURE() >= 1000000, "#,0.0,, "Mn"",
    SELECTEDMEASURE() >= 1000, "#,0.0, "B"",
    "#,0")

FORMAT ile metne çevirmenin (Measure Lab: Akıllı Etiket) aksine, dinamik biçim dizesi sayının kendisini korur.

Alan parametresi, adım adım

  1. Modelleme → Yeni parametre → Alanlar.
  2. Listeye ölçüleri (Net Satış, Brüt Kâr, Sipariş Sayısı) ya da sütunları (Kategori, Kanal, Segment) ekle; sırala, yeniden adlandır.
  3. “Sayfaya dilimleyici ekle” işaretli bırak. Power BI bir parametre tablosu oluşturur; her satırda NAMEOF('Ölçüler'[Net Satış]) gibi bir başvuru vardır.
  4. Parametre sütununu görselin eksenine ya da değerine koy. Kullanıcı dilimleyiciden seçtikçe görsel alan değiştirir.

Ölçülerle alan parametresi “ölçü seçici”, sütunlarla “eksen seçici” olur. İkisi aynı görselde birlikte kullanılabilir. Bu uygulamadaki OlcuSecimi tablosu ve [Seçili Ölçü] ölçüsü, alan parametresi gelmeden önceki SWITCH tabanlı yöntemin benzetimidir.

Bu oyun alanındaHesaplama grupları ve görsel hesaplamalar model ya da görsel düzeyinde tanımlandığı için DAX Playground’da çalıştırılamaz. Kavramları ve kalıpları bilmen sınav ve iş için yeterlidir.
Uzmanlaş

Birden çok hesaplama grubu: öncelik (precedence)

Finans müdürü iki şey istiyor: her ölçüyü YTD görmek ve her ölçüyü gün başına görmek. Ekip iki ayrı hesaplama grubu kurar: Zaman (Cari, GY, YTD) ve Ölçek (Toplam, Gün Başına). Matriste ikisinden birer öğe seçilince motor iki öğeyi iç içe uygular. Hangisinin içte, hangisinin dışta olacağını grubun Öncelik (Precedence) özelliği belirler.

Kural şudur: düşük öncelikli grup içte, yüksek öncelikli grup dışta çalışır. Motor en yüksek öncelikli öğeden başlar; o öğedeki SELECTEDMEASURE() yerine bir alttaki öğeyi koyar; en sonda gerçek ölçüye ulaşır. Ölçek grubu 10, Zaman grubu 20 ise “Gün Başına + YTD” şuna dönüşür:

Günlük Ort. YTD (Zaman dışta) =
CALCULATE(DIVIDE([Net Satış], COUNTROWS(Tarih)), DATESYTD(Tarih[Tarih]))
Günlük Ort. YTD (Ortalama dışta) =
DIVIDE(CALCULATE([Net Satış], DATESYTD(Tarih[Tarih])), COUNTROWS(Tarih))

Mart 2024 hücresinde ilk yazım 1.707,59 ₺ verir: Ocak–Mart toplamı, Ocak–Mart gün sayısına bölünür. Öncelikler ters verilirse ikinci yazım çalışır ve 5.012,60 ₺ çıkar: üç aylık toplam yalnızca Mart'ın 31 gününe bölünür. İki sayı da “doğru hesaplanmış” görünür; yalnızca biri iş sorusunun cevabıdır. Öncelik bir teknik ayrıntı değil, iş kuralıdır.

Grup türüÖnerilen yerNeden
Para birimi çevirisi, ölçek (bin/milyon), gün başınaDüşük öncelik (içte)Önce tek tek değerler dönüşür, sonra zaman penceresi uygulanır
Zaman zekâsı (YTD, GY, YoY %)Yüksek öncelik (dışta)Pencere, dönüşmüş değerin tamamını sarmalı
Yalnızca biçim değiştiren grupEn yüksekBiçim dizesinde en yüksek öncelikli grubun ifadesi kazanır

Biçim dizeleri de öncelikle yarışır: en yüksek öncelikli grubun dinamik biçim dizesi geçerli olur; ölçünün kendi biçimi her hesaplama grubunun altında kalır. “YoY % neden ₺ ile görünüyor?” sorusunun cevabı çoğu zaman budur.

ISSELECTEDMEASURE: öğeyi her ölçüye uygulama

Zaman grubundaki YoY % öğesi [Net Satış] için anlamlıdır. Ama [Kâr Marjı %] için “marjın yüzde değişimi” çıkar: %20'den %22'ye çıkan marj “%10 büyüme” olarak görünür. Finans ise “2 puan arttı” demek ister. Metin döndüren ölçülerde (ör. [Hedef Durumu], [Dinamik Başlık]) durum daha kötüdür: öğedeki aritmetik “metin sayıya çevrilemiyor” hatası verir.

-- Zaman grubu, "YoY" öğesi
VAR Simdi = SELECTEDMEASURE()
VAR Once  = CALCULATE(SELECTEDMEASURE(), SAMEPERIODLASTYEAR(Tarih[Tarih]))
RETURN
SWITCH(TRUE(),
    NOT ISNUMBER(Simdi), BLANK(),                              -- metin ölçüleri: dokunma
    ISSELECTEDMEASURE([Kâr Marjı %], [Ortalama İndirim %]), (Simdi - Once) * 100,   -- oranlar: puan farkı
    DIVIDE(Simdi - Once, Once))                                 -- tutarlar: yüzde değişim

-- Aynı öğenin dinamik biçim dizesi
IF(ISSELECTEDMEASURE([Kâr Marjı %], [Ortalama İndirim %]), "+0.0"" puan"";-0.0"" puan""", "+0.0%;-0.0%")

ISSELECTEDMEASURE ölçüye başvuru alır; ölçü yeniden adlandırılınca başvuru da güncellenir. SELECTEDMEASURENAME() = "Kâr Marjı %" gibi metin karşılaştırması da çalışır, ama ilk yeniden adlandırmada sessizce bozulur. SELECTEDMEASUREFORMATSTRING() ise “ölçünün kendi biçimini koru” demenin yoludur; Cari ve GY öğelerinin biçim dizesine bunu yazarsan ₺ ölçüler ₺, adet ölçüleri adet kalır.

Seçim ifadeleri: çoklu ya da boş seçim

Bir dilimleyiciden aynı gruptan iki öğe seçildiğinde ne olur? Hesaplama öğesi yalnızca bağlamda tek öğe varken uygulanır. Varsayılan davranışta iki öğe seçilirse grup hiç uygulanmaz ve ölçü olduğu gibi görünür. Kullanıcı “YTD ve GY” seçtiğini sanırken çıplak cari değeri görür. Bunu iki isteğe bağlı grup özelliği yönetir:

Durumİfade tanımlı değilseTanımlıysa
Tek öğe seçiliÖğe uygulanırÖğe uygulanır
Birden çok öğe ya da çakışan seçimGrup uygulanmazmultipleOrEmptySelectionExpression sonucu
Grup hiç filtrelenmemişGrup uygulanmaznoSelectionExpression sonucu

Para birimi grubunda tipik kullanım: hiçbir şey seçilmemişse TL göster (noSelectionExpression), iki para birimi seçilmişse sayı yerine BLANK döndür ve biçim dizesinde “Tek para birimi seç” yaz. Yanlış rakam göstermek, boş göstermekten her zaman daha pahalıdır.

Yan etkiler: grup eklenince neler değişir?

  • Örtük ölçüler kapanır. Modelde “örtük ölçüleri engelle” (Discourage implicit measures) açılır; sütunların yanındaki Σ kaybolur, Satislar[Tutar] artık değer alanına sürüklenemez. Var olan görseller çalışmaya devam eder, ama rapor yazarları için her toplam açık bir ölçü olmalıdır.
  • Tüm ölçüler “variant” türüne geçer. Rapor tarafında ölçünün veri türü sabit değildir. Bir ölçünün dinamik biçim dizesini başka yerde yeniden kullanıyorsan hata görebilirsin; ifadeyi FORMAT(…, "") ile sarmak çözüm yoludur.
  • Güvenlik: Hesaplama grubu tablosuna RLS ya da OLS tanımlanamaz. Güvenlik diğer tablolarda kalır (Satır ve nesne düzeyinde güvenlik dersi).
  • Aynı gruptan iki öğe birleşmez. “GY'nin YTD'si” tek gruptan iki öğeyle yapılamaz; ya iki ayrı grup ya da öğe içinde yan özyineleme (sideways recursion): öğe, CALCULATE(SELECTEDMEASURE(), Zaman[Hesap] = "GY") ile kardeş öğeyi çağırabilir.
  • Ölçü içinden çağırma: CALCULATE([Net Satış], Zaman[Hesap] = "YTD") geçerlidir. Bu, “YTD Satış” ölçüsünü ayrıca yazmadan bir kart görseline koymanın yoludur.

Alan parametresiyle birlikte kullanmak

Yönetim panosunda kullanıcı bir dilimleyiciden ölçüyü seçer (Net Satış, Brüt Kâr, Sipariş Sayısı); matrisin sütunlarında Zaman grubunun öğeleri durur. Ölçü seçiciyi alan parametresi (field parameter), varyasyonları hesaplama grubu sağlar: 3 ölçü × 3 öğe için tek ölçü yazmazsın. Dikkat edilecekler:

  • Alan parametresinde örtük ölçü kullanılamaz; zaten hesaplama grubu da bunu istemez.
  • Alan parametresi dilimleyicisinde hiçbir şey seçmemek “hepsi seçili” demektir; görsel birden çok ölçüyle dolar. Dilimleyiciyi “tek seçim” yap.
  • Biçim: Zaman grubunun YoY öğesi biçimi ezer; kart başlığında ölçü adını göstermek için parametre tablosunun görünen ad sütununu kullan.
YolNe zaman?BakımDikkat
Hesaplama grubuAynı dönüşüm birçok ölçüye uygulanacaksaTek yerde; yeni ölçü kendiliğinden kapsanırÖncelik, variant tür, örtük ölçüler
Alan parametresiKullanıcı ölçü ya da eksen seçecekseKolay; Desktop arayüzüBoş seçim = hepsi
SWITCH ölçüsü ([Seçili Görünüm])Az sayıda, özel mantıkHer ölçü için ayrı dalDallar çoğaldıkça okunmaz olur
Görsel hesaplamaTek görsele özel kümülatif/farkYalnızca o görseldeBaşka görselde yeniden kullanılamaz

Test etmek: önce sorguyla, sonra görselle

Hesaplama grubunu yayımlamadan önce DAX sorgu görünümünde (DAX query view) yıl × öğe ızgarası çıkar ve bilinen sayılarla karşılaştır. Bu oyun alanında aynı fikri Gorunum tablosu ve [Seçili Görünüm] ölçüsüyle deneyebilirsin:

EVALUATE
SUMMARIZECOLUMNS(Tarih[Yil], Gorunum[Gorunum], "Değer", [Seçili Görünüm])

Sonuçta iki sağlama hemen görünür. Yıl düzeyinde YTD = Cari olmalı: 2024 için ikisi de 747.065,70 ₺. 2024'ün GY'si = 2023'ün Carisi olmalı: 400.869,55 ₺. 2022'de GY ve YoY % satırı hiç gelmez, çünkü önceki yıl yok; BLANK olan satırı SUMMARIZECOLUMNS atar. Bu üç kural tutmuyorsa öğede ya da tarih tablosunda sorun vardır.

Kontrol listesiHer grup için öncelik yazılı mı ve gerekçesi belgelendi mi? · Oran ve metin ölçüleri ISSELECTEDMEASURE / ISNUMBER ile korunuyor mu? · Çoklu seçim ve boş seçim ifadeleri tanımlı mı? · Yıl düzeyinde YTD = Cari, GY = önceki yılın Carisi sağlaması yapıldı mı? · Rapor yazarlarına “Σ artık yok, açık ölçü kullan” notu iletildi mi?
Alıştırmalara geç (10)