Ana içeriğe geç
Kesit Power BI
İleri · Zaman Zekâsı

Gelişmiş zaman hesapları

Hareketli ortalama, kümülatif toplam, dönem başı/sonu ve özel dönemler.

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

Hareketli ortalama

3 Ay Hareketli Ort. =
VAR Donem = DATESINPERIOD(Tarih[Tarih], MAX(Tarih[Tarih]), -3, MONTH)
RETURN DIVIDE(CALCULATE([Net Satış], Donem), 3)

DATESINPERIOD(tarih, başlangıç, sayı, birim) başlangıçtan geriye (negatif sayı) ya da ileriye doğru bir tarih aralığı döndürür. MAX(Tarih[Tarih]) görünen dönemin son günüdür.

Ay sayısını sabit 3 yerine gerçekten verisi olan ay sayısına bölmek istersen:

3 Ay Ortalama (gerçek) =
VAR Donem = DATESINPERIOD(Tarih[Tarih], MAX(Tarih[Tarih]), -3, MONTH)
RETURN AVERAGEX(CALCULATETABLE(VALUES(Tarih[YilAy]), Donem), [Net Satış])

Kümülatif toplam

Kümülatif Satış =
CALCULATE([Net Satış], FILTER(ALL(Tarih[Tarih]), Tarih[Tarih] <= MAX(Tarih[Tarih])))

ALL(Tarih[Tarih]) tarih filtresini kaldırır, FILTER verinin başından görünen dönemin sonuna kadar olan günleri geri koyar. Tarih tablosu olarak işaretlenmiş tablonun tarih sütununa filtre koymak, aynı tablonun diğer sütunlarındaki (Yıl, Ay) filtreleri de kaldırır.

Dönem başı ve sonu

Paralel dönem

Geçen Yıl Tamamı = CALCULATE([Net Satış], PARALLELPERIOD(Tarih[Tarih], -1, YEAR))

PARALLELPERIOD, görünen dönemi kapsayan tam dönemi kaydırır: Mart 2024 satırında 2023'ün tamamını verir. SAMEPERIODLASTYEAR ise yalnızca Mart 2023'ü.

Uzmanlaş

Kümülatif toplam: "nereden başlıyor?" sorusu

Satış direktörü 2024 dilimleyicisini seçip kümülatif grafiğe bakıyor; Ocak 2024 noktası 551.139,60 ₺. "Ocak'ta bu kadar satmadık" diyor. Haklı: [Kümülatif Satış] verinin başından (Haziran 2022) sayıyor. Hangi başlangıç istendiğini önceden sor:

BaşlangıçFiltreOcak 2024 (2024 seçili)
Verinin başıFILTER(ALL(Tarih[Tarih]), Tarih[Tarih] <= MAX(Tarih[Tarih]))551.139,60
Seçimin başıFILTER(ALLSELECTED(Tarih[Tarih]), Tarih[Tarih] <= MAX(Tarih[Tarih]))47.432,85
Yılın başıDATESYTD(Tarih[Tarih])47.432,85

İkinci ve üçüncü satır burada aynıdır, ama kullanıcı dilimleyicide Mart–Haziran seçerse ayrışır: seçimin başı Mart'tan, yıl başı Ocak'tan sayar. Mekanizma: ALL(Tarih[Tarih]) tarih tablosundaki tüm filtreleri kaldırır (tablo tarih tablosu olarak işaretli olduğu için); ALLSELECTED yalnızca görselin kendi satırlarından gelenleri kaldırır, dilimleyiciyi bırakır.

Kenar durum: Tarih tablosu verinin bittiği günden sonra da devam ediyorsa (ör. yıl sonuna kadar), kümülatif çizgi gelecek aylarda düz bir çizgi olarak sürer. Son satış tarihinden sonraki dönemlerde ölçüyü boş döndür.

Hareketli toplamlar ve eksik geçmiş

"Son 12 ay" ölçüsü Aralık 2022'de 102.837,20 ₺ gösterir. Ama veri 22 Haziran 2022'de başladığı için bu sayı aslında 6 ay 9 günün toplamıdır. Grafikte bu nokta, gerçek 12 aylık değerlerin yanında "düşüş" gibi görünür. Doğru davranış, pencere tam dolmadıkça boş döndürmektir:

Tam 12 Ay Hareketli =
VAR Son = MAX(Tarih[Tarih])
VAR IlkSatis = CALCULATE(MIN(Satislar[Tarih]), REMOVEFILTERS(Tarih))
VAR PencereBas = EDATE(Son, -12) + 1
RETURN
    IF(
        IlkSatis <= PencereBas,
        CALCULATE([Net Satış], DATESINPERIOD(Tarih[Tarih], Son, -12, MONTH))
    )

Yıl kırılımında 2022 boş, 2023 400.869,55 ₺, 2024 747.065,70 ₺ döner. IlkSatis ifadesi REMOVEFILTERS(Tarih) ile yalnızca tarih filtresini kaldırır; kategori filtresi kalır. Böylece sonradan satışa başlayan bir kategori kendi başlangıç tarihine göre değerlendirilir.

Dönem başı ve sonu: yarı toplanabilir değerler

StokGorunum her ayın son gününde alınmış anlık görüntülerdir (36 tarih × 40 ürün). Stok adedini yıllar boyunca toplamak anlamsızdır:

2024 içinİfadeDeğer
Düz toplam (yanlış)SUM(StokGorunum[StokAdet])4.183
Dönem sonuCLOSINGBALANCEYEAR(SUM(...), Tarih[Tarih])311
Dönem başıOPENINGBALANCEYEAR(SUM(...), Tarih[Tarih])309 (31 Aralık 2023)

LASTDATE ve CLOSINGBALANCE fonksiyonları burada çalışıyor, çünkü görüntüler tam ay sonunda alınmış. Görüntü haftanın belirli bir gününde alınıyorsa ya da son gün eksikse, dönemin son günü boş döner ve stok sıfır gibi görünür. Bu durumda "dönemdeki son görüntü tarihini bul" kalıbı ([Stok Adedi] ölçüsü) daha sağlamdır. Açılış ile kapanış arasındaki fark, dönemdeki net stok değişimidir: 2023'te −16, 2024'te +2 adet.

Tarih tablosu sorunları

En sık görülen hata, zaman zekâsını olgu tablosunun tarih sütunuyla yazmaktır:

GY (Olgu Tarihiyle) =
CALCULATE([Net Satış], SAMEPERIODLASTYEAR(Satislar[Tarih]))

Bu ölçü her ay satırında boş, toplam satırında 376.747,20 ₺ gösterir; ikisi de yanlıştır. Neden? Satislar[Tarih] yalnızca satış olan günleri içerir ve bu sütundaki filtre, Tarih tablosundaki ay filtresini kaldırmaz. Kaydırılmış tarihlerle ay filtresinin kesişimi boştur. Toplamda ay filtresi olmadığı için "satış olan günlerin bir yıl öncesi" toplanır: anlamsız bir sayı. Doğru yazım [Satış GY]: SAMEPERIODLASTYEAR(Tarih[Tarih]).

  • Kesintisiz olmalı: Bu modelde Tarih 1.096 satır ve ilk ile son gün arası 1.096 gün; eksik gün yok. Satış Haziran 2022'de başlasa da tablo yılın başından başlar; zaman zekâsı tam yılları ister.
  • Tarih tablosu olarak işaretle: İşaret yoksa Tarih[Tarih] filtresi diğer tarih sütunlarındaki filtreleri kaldırmaz ve ALL/REMOVEFILTERS eklemen gerekir.
  • Otomatik tarih/saat (Auto date/time) kapalı: Her tarih sütunu için gizli tablo üretir, modeli büyütür ve ekip içinde farklı hiyerarşiler kullanılmasına yol açar.
  • Kapsam kontrolü: COUNTROWS(FILTER(Satislar, ISBLANK(RELATED(Tarih[Yil])))) tarih tablosunun dışında kalan satış satırlarını sayar; bu modelde 0.

Mali yıl (Temmuz başlangıçlı) YTD

Finans mali yılı 1 Temmuz'da başlatıyor. Standart yol TOTALYTD'nin yıl sonu bağımsız değişkenidir:

Mali YTD (TOTALYTD) =
TOTALYTD([Net Satış], Tarih[Tarih], "6/30")

Microsoft Learn bu dizenin, modelin oluşturulduğu istemcinin bölgesel ayarına göre yorumlandığını belirtiyor ve "ay/gün" biçimini öneriyor. Türkçe bölgesel ayarlı makinelerle çalışan bir ekipte bu bir belirsizlik kaynağıdır. Bu uygulamanın motoru dizeyi her zaman ay/gün olarak okur, ama paylaşılan bir modelde bu güvenceye yaslanamazsın. Bölgesel ayardan bağımsız, açık bir yazım:

Mali YTD (Açık) =
VAR Son = MAX(Tarih[Tarih])
VAR MaliBas = DATE(YEAR(Son) - IF(MONTH(Son) < 7, 1, 0), 7, 1)
RETURN CALCULATE([Net Satış], DATESBETWEEN(Tarih[Tarih], MaliBas, Son))
AyTakvim YTDMali YTD
Haziran 2024300.492,75546.898,75 (Temmuz 2023 – Haziran 2024)
Temmuz 2024361.440,7560.948,00 (yeni mali yıl)
Aralık 2024747.065,70446.572,95

Eksen için Tarih tablosuna Power Query'de bir mali yıl sütunu ekle. Adlandırma kuralını (mali yıl, bittiği takvim yılıyla mı anılıyor?) finansla yazılı olarak kararlaştır:

= Table.AddColumn(Kaynak, "MaliYil", each if Date.Month([Tarih]) >= 7 then Date.Year([Tarih]) + 1 else Date.Year([Tarih]), Int64.Type)

Mali yılın önceki yıl karşılaştırması için açık yazımı CALCULATE([Mali YTD (Açık)], SAMEPERIODLASTYEAR(Tarih[Tarih])) ile sarmak yeterlidir. Mali takvimi takvim nesnesiyle tanımlamak ayrı bir konudur; Takvim tabanlı zaman zekâsı dersinde ele alınır.

İki tarih aralığını karşılaştırmak

Pazarlama, sayfada iki ayrı tarih dilimleyicisi istiyor: "kampanya dönemi" ve "karşılaştırma dönemi". Tek Tarih tablosuyla iki bağımsız seçim yapılamaz. Desen:

  1. İlişkisiz ikinci bir tarih tablosu oluştur: KarsilastirmaTarih = CALENDAR(DATE(2022, 1, 1), DATE(2024, 12, 31)). Modelde hiçbir tabloya bağlama.
  2. Ana dilimleyici Tarih[Tarih]'i, ikinci dilimleyici KarsilastirmaTarih[Tarih]'i kullanır.
  3. Karşılaştırma ölçüsü ikinci tablonun seçimini okur ve Tarih'e uygular:
Karşılaştırma Dönemi Satışı =
VAR Bas = MIN(KarsilastirmaTarih[Tarih])
VAR Bit = MAX(KarsilastirmaTarih[Tarih])
RETURN CALCULATE([Net Satış], DATESBETWEEN(Tarih[Tarih], Bas, Bit))

DATESBETWEEN, işaretli tarih tablosunun Tarih sütununa filtre koyduğu için ana dilimleyicinin seçimini geçersiz kılar. Örnek: Mart–Mayıs 2024 satışı 143.723,65 ₺, Mart–Mayıs 2023 ise 74.307,45 ₺; artış %93,4. İki aralık da 92 gün olduğu için doğrudan karşılaştırılabilir.

  • Farklı uzunluk: 30 gün ile 45 günü karşılaştırıyorsan günlük ortalamaya çevir.
  • Eksen tuzağı: Grafikte ay ekseni ana Tarih'ten gelir; karşılaştırma ölçüsü her ayda aynı toplamı gösterir. Bu desen kartlar ve tablolar için uygundur; çizgi grafikte "dönemin kaçıncı günü" gibi ortak bir eksen gerekir.
  • Varsayılan: İkinci dilimleyicide seçim yoksa MIN ve MAX tüm tabloyu kapsar. Başlıkta seçili aralığı ölçüyle yazdır.

Kontrol listesi

  1. Kümülatif hangi günden başlıyor: veri, seçim, yıl?
  2. Hareketli pencerede eksik geçmiş boş mu gösteriliyor?
  3. Stok gibi değerler dönem sonu/başı ile mi alınıyor? Görüntü tarihleri dönem sonuna denk geliyor mu?
  4. Zaman zekâsı Tarih[Tarih] ile mi yazıldı? Tablo işaretli, kesintisiz mi?
  5. Mali yıl tanımı ve adlandırma kuralı finansla yazılı mı?
  6. İki dönem karşılaştırmasında uzunluklar eşit mi, eksen anlamlı mı?
Alıştırmalara geç (11)