Ana içeriğe geç
Kesit Power BI
Temel · DAX Temelleri

Hesaplanmış tablolar: CALENDAR, GENERATESERIES, DATATABLE ve özet tablolar

DAX ile modele kalıcı tablo eklemek: ne zaman hesaplanır, neden dilimleyiciye tepki vermez; parametre ve eşik tabloları, küçük arama tabloları, özet tablolar ve Power Query mi, ölçü mü kararı.

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ç.

Şimdiye kadar DAX ile iki şey yazdın: ölçü (bir sayı döndürür) ve hesaplanmış sütun (her satıra bir değer ekler). Üçüncü bir seçenek daha var: hesaplanmış tablo (calculated table). Formül bir tablo döndürür ve bu tablo modele, içe aktarılmış bir tablo gibi eklenir. Ona ilişki kurabilir, sütunlarını dilimleyicide ya da eksende kullanabilirsin.

Hesaplanmış tablo ne zaman hesaplanır?

Desktop’ta Tablo görünümü ya da Model görünümü → Hesaplamalar grubu → Yeni tablo (New table). Formül çubuğuna tablo döndüren bir ifade yazarsın:

Kategori Özeti =
SUMMARIZECOLUMNS(
    Kategoriler[Kategori],
    "Satış", [Net Satış],
    "Hedef", [Hedef]
)

Bu tablonun en önemli özelliği ne zaman hesaplandığıdır:

Örnek: Yukarıdaki tabloda Elektronik satırının Satış değeri 339.303,65 ₺’dir (tüm yıllar, tüm kanallar). Sayfaya “Kanal = Web” dilimleyicisi koysan da bu sütun 339.303,65 kalır. Aynı tabloda [Net Satış] ölçüsünü bir görsele koyarsan Web seçiminde 130.786,85 ₺ görürsün. Fark şudur: ölçü sorgu anında, filtre bağlamına göre hesaplanır; hesaplanmış tablodaki sütun ise yenileme anının dondurulmuş sonucudur.

DirectQuery notuHesaplanmış tablo DirectQuery bir kaynaktan besleniyorsa kaynak değiştiğinde kendiliğinden güncellenmez; anlam modeli yenilendikten sonra değişikliği yansıtır.

Tarih tabloları: CALENDAR ve CALENDARAUTO

En yaygın hesaplanmış tablo tarih tablosudur. Nasıl kurulduğu, hangi sütunların ekleneceği ve “Tarih tablosu olarak işaretle” adımı “Tarih tablosu” dersinde. Burada yalnızca iki fonksiyonun farkını hatırlayalım:

Takvim = CALENDARAUTO()
CALENDARAUTO beklenmedik bir sütunu da görürBu modelde Calisanlar[IseGiris] 2015’ten başlıyor. Power BI’da CALENDARAUTO bu sütunu da hesaba katar ve takvim 2015-01-01’den başlar: 1.096 yerine 3.653 gün. Doğum tarihi, sözleşme bitiş tarihi gibi sütunlar takvimi on yıllarca uzatabilir. Aralığı bilerek seçmek için CALENDAR kullan.

GENERATESERIES: parametre ve eşik tabloları

GENERATESERIES(başlangıç, bitiş, adım) tek sütunlu (Value) bir sayı dizisi üretir. Bu tablo bir dilimleyiciye konur, ölçü de seçilen değeri okur. Örnek soru: “Kargo hedefimiz kaç gün olmalı?” Mevcut [Zamanında Teslim %] ölçüsü eşiği 3 güne sabitlemiş. Eşiği kullanıcıya bırakalım:

Teslim Eşiği =
GENERATESERIES(1, 7, 1)
Eşik İçinde Teslim % =
VAR Esik = SELECTEDVALUE('Teslim Eşiği'[Value], 3)
RETURN
DIVIDE(
    CALCULATE(COUNTROWS(Satislar), Satislar[KargoGun] <= Esik, NOT ISBLANK(Satislar[KargoGun])),
    CALCULATE(COUNTROWS(Satislar), NOT ISBLANK(Satislar[KargoGun]))
)

Kargo günü bilinen satırlarda eşik 1 gün iken oran %29,6, 3 günde %60,2, 5 günde %87,2, 7 günde %94,2. Kullanıcı dilimleyiciyi kaydırdıkça kart değişir. Bu tablo modelde ilişkisizdir; yalnızca seçim taşır. Desktop’taki Modelleme → Yeni parametre → Sayısal aralık sihirbazı da arka planda aynı GENERATESERIES tablosunu ve bir SELECTEDVALUE ölçüsünü oluşturur (“Segmentasyon” dersindeki ne olur analizi).

DATATABLE ve tablo oluşturucu: küçük arama tabloları

Modelde olmayan küçük bir listeye ihtiyacın varsa (kanal sırası, durum grupları, eşik adları) iki yol var:

Kanal Sırası =
DATATABLE(
    "Kanal", STRING,
    "Sira", INTEGER,
    {
        {"Mağaza", 1},
        {"Web", 2},
        {"Mobil", 3}
    }
)
Kanal Sırası 2 =
{ ("Mağaza", 1), ("Web", 2), ("Mobil", 3) }

Kanal Sırası tablosunu Satislar[Kanal] ile ilişkilendirip Kanal sütununu Sira’ya göre sıralarsan grafikler Mağaza → Web → Mobil sırasıyla dizilir. Aynı işi Power Query’de Giriş → Veri gir (Enter data) ile de yapabilirsin; o tabloyu iş kullanıcısı arayüzden düzenleyebilir.

Özet tablolar: SUMMARIZECOLUMNS ve ADDCOLUMNS

Bir özet tablo, büyük bir olgu tablosunu daha kaba bir taneciğe indirir. İki kalıp:

Yıl Kanal Özeti =
SUMMARIZECOLUMNS(
    Tarih[Yil],
    Satislar[Kanal],
    "Satış", [Net Satış]
)
Kanal Satışı =
ADDCOLUMNS(
    VALUES(Satislar[Kanal]),
    "Satış", [Net Satış]
)

SUMMARIZECOLUMNS gruplamayı ve ölçüyü tek adımda yapar; tüm ölçülerin boş döndüğü satırları kendisi atar. ADDCOLUMNS ise elindeki tabloya sütun ekler; her satırda ölçü çağrıldığı için bağlam geçişi olur (“Bağlam geçişi” dersi). Aynı ifadeleri bir ölçünün içinde sanal tablo olarak da kullanabilirsin: tablo modele yazılmaz, ölçü her çalıştığında yeniden kurulur ve dilimleyiciye tepki verir.

Hedefi Tutan Kategori Sayısı =
COUNTROWS(
    FILTER(
        ADDCOLUMNS(VALUES(Kategoriler[Kategori]), "G", [Hedef Gerçekleşme %]),
        [G] >= 1
    )
)

Bu ölçü 2023’te 3, 2024’te 1 döndürür (2024’te yalnızca Kitap: %100,2). Aynı mantığı hesaplanmış tabloyla yapsaydın yıl dilimleyicisi sonucu değiştirmezdi.

Hesaplanmış tablo mu, Power Query mi, ölçü mü?

İhtiyaçEn iyi yerNeden?
Kaynaktan gelen veriyi temizlemek, birleştirmekPower QueryKaynağa yakın; sorgu katlama yapılabilir
İş kullanıcısının elle düzenleyeceği küçük listePower Query “Veri gir”Formül bilmeden düzenlenir
Tarih tablosu, parametre tablosu, sabit sıralama listesiHesaplanmış tabloKısa formül; kaynak gerektirmez
Modeldeki başka tablolardan türeyen boyut (rol oynayan tarih kopyası gibi)Hesaplanmış tabloModel değiştikçe yenilemede kendini günceller
Dilimleyiciye göre değişmesi gereken her sonuçÖlçü (sanal tablo)Sorgu anında hesaplanır

Tuzaklar

Önce sorguda deneBir hesaplanmış tablo yazmadan önce aynı ifadeyi DAX sorgu görünümünde EVALUATE ile çalıştır. Satır sayısını ve değerleri gördükten sonra “Yeni tablo”ya yapıştır. Aşağıdaki alıştırmaların ilk üçü bu yüzden sorgu biçiminde.
Alıştırmalara geç (8)