Ş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:
- Formülü yazdığında ya da değiştirdiğinde bir kez hesaplanır.
- Beslendiği tablolardan biri yenilendiğinde yeniden hesaplanır.
- Rapor açıkken, kullanıcı dilimleyiciye tıkladığında hesaplanmaz. Sonuç modelde saklanmış durur.
Ö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.
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:
CALENDAR(başlangıç, bitiş)verdiğin iki tarih arasındaki her günü üretir.CALENDAR(DATE(2022,1,1), DATE(2024,12,31))1.096 satırdır.CALENDARAUTO()modeldeki tarih sütunlarına bakar, en küçük ve en büyük tarihi tam yıllara yuvarlar. İsteğe bağlı argüman mali yılın bittiği aydır:CALENDARAUTO(6)Temmuz–Haziran yılları üretir.
Takvim = CALENDARAUTO()
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) }
- DATATABLE sütun adlarını ve türlerini (STRING, INTEGER, DOUBLE, CURRENCY, BOOLEAN, DATETIME) açıkça verir. Değerler sabit olmalıdır; içine ölçü ya da ifade yazamazsın.
- Tablo oluşturucu
{ (…), (…) }daha kısadır ama sütunlarValue1,Value2adını alır ve tür otomatik seçilir. Anlamlı ad içinSELECTCOLUMNSile yeniden adlandır. - Tek sütunlu oluşturucu
{1, 2, 3}birValuesütunu üretir; ölçülerdeINile de kullanılır.
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 yer | Neden? |
|---|---|---|
| Kaynaktan gelen veriyi temizlemek, birleştirmek | Power Query | Kaynağa yakın; sorgu katlama yapılabilir |
| İş kullanıcısının elle düzenleyeceği küçük liste | Power Query “Veri gir” | Formül bilmeden düzenlenir |
| Tarih tablosu, parametre tablosu, sabit sıralama listesi | Hesaplanmış tablo | Kısa formül; kaynak gerektirmez |
| Modeldeki başka tablolardan türeyen boyut (rol oynayan tarih kopyası gibi) | Hesaplanmış tablo | Model 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
- Dilimleyiciye tepki yok: “Seçili yıldaki ilk 5 ürün” gibi bir hesaplanmış tablo yazarsan seçim değiştiğinde liste değişmez. Bu iş bir ölçünün içinde TOPN ile yapılır.
- Yenileme ve bellek maliyeti: Tablo modelde saklanır ve sıkıştırılır. Tarih × ürün çaprazı (
CROSSJOIN) bu modelde 1.096 × 40 = 43.840 satır; buna kanal da eklersen 131.520 satır olur. Büyük modelde bu, her yenilemede zaman ve bellek demektir. - Döngüsel bağımlılık (circular dependency): Tablo A’dan türeyen bir hesaplanmış tabloyu A’ya ilişkiyle bağlarsan ya da A’ya, bu tabloyu okuyan bir hesaplanmış sütun eklersen Power BI “döngüsel bağımlılık algılandı” hatası verebilir. Boyutu olgudan türetiyorsan
VALUESveALLyerine boş satıra bağımlı olmayanDISTINCTya daALLNOBLANKROWkullan; daha temiz yol boyutu Power Query’de kurmaktır. - Tekrarlanan mantık: Bir özet tablo ile bir ölçü aynı sayıyı farklı tanımla hesaplıyorsa raporda iki “doğru” oluşur. Özet tablodaki sütunlar mümkünse hazır ölçüleri çağırsın.
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.