Ana içeriğe geç
Kesit Power BI
Orta · DAX Kalıpları

Yarı toplanabilir ölçüler (semi-additive): stok, bakiye, kapanış

Bazı boyutlarda toplanan, zamanda toplanmayan değerler; dönem sonu, dönem başı ve ortalama bakiye.

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

Üç tür ölçü

TürÖrnekDavranış
ToplanabilirSatış tutarı, adetHer boyutta toplanır
Yarı toplanabilirStok adedi, banka bakiyesi, çalışan sayısı, abone sayısıÜrünler/şubeler arasında toplanır; zamanda toplanmaz
ToplanamazOran, ortalama, yüzdeHiçbir boyutta toplanmaz; her düzeyde yeniden hesaplanır

StokGorunum tablosu her ürünün her ay sonundaki stokunu tutar. 2024 satırında SUM(StokGorunum[StokAdet]) 12 ayın stokunu toplar; gerçek stokun yaklaşık 12 katıdır. Doğru cevap: yılın son görüntüsü.

Dönem sonu (kapanış) değeri

Stok Adedi =
VAR SonTarih = CALCULATE(MAX(StokGorunum[Tarih]))
RETURN CALCULATE(SUM(StokGorunum[StokAdet]), Tarih[Tarih] = SonTarih)

Alternatifler: LASTNONBLANK(Tarih[Tarih], CALCULATE(COUNTROWS(StokGorunum))) veri olan son günü bulur; CLOSINGBALANCEMONTH / QUARTER / YEAR takvimin son gününü kullanır (o gün veri yoksa boş döner).

Ürün bazında farklı son tarihBazı ürünler son ayda kaydedilmemişse, ürünlerin kendi son değerlerini toplamak gerekir: SUMX(VALUES(Urunler[UrunNo]), CALCULATE(SUM(StokGorunum[StokAdet]), LASTNONBLANK(Tarih[Tarih], CALCULATE(COUNTROWS(StokGorunum))))).

Dönem başı ve ortalama bakiye

Açılış Stoku =
CALCULATE([Stok Adedi], PREVIOUSDAY(STARTOFMONTH(Tarih[Tarih])))

Ortalama Stok =
AVERAGEX(VALUES(Tarih[YilAy]), [Stok Adedi])

Ortalama stok, stok devir hızı hesabında kullanılır: Stok Devir Hızı = DIVIDE([Net Maliyet], [Ortalama Stok Değeri]).

Toplanabilir yanı unutma

GelenAdet (depoya giren) toplanabilir bir hareket ölçüsüdür: SUM doğrudur. İyi bir stok raporu ikisini birlikte gösterir: hareket (giren/çıkan) ve görüntü (bakiye). Stok raporu bu ayrımı kullanıyor.

Uzmanlaş

Yanlışın boyutu: SUM stoku ne kadar şişirir?

Depo müdürü yıl sonu raporunda “stok adedi” satırında 4.183 görüyor ve şaşırıyor. Depoda 311 ürün var. Fark, ay sonu görüntülerinin toplanmasından geliyor. Bunu tek sorguyla göster:

EVALUATE
SUMMARIZECOLUMNS(
    Tarih[Yil],
    "Toplanmış (yanlış)", SUM(StokGorunum[StokAdet]),
    "Kapanış", [Stok Adedi],
    "Toplanmış değer", SUM(StokGorunum[StokDegeri]),
    "Kapanış değeri", [Stok Değeri]
)
YılSUM(StokAdet)Kapanış adediSUM(StokDegeri)Kapanış değeri
20223.5413251.964.884 ₺164.498 ₺
20234.1813092.048.566 ₺166.057 ₺
20244.1833112.163.992 ₺163.465 ₺

Toplanmış değer kapanışın 13 katından fazla. “12 ay toplandıysa 12 kat olmalı” diye düşünme: stok ay içinde dalgalandığı için oran sabit değildir. Bu yüzden yanlış sayıyı 12’ye bölerek “düzeltmek” de yanlıştır. Tüm dönem satırında fark daha da büyük: 11.905’e karşı 311.

Kapanışı bulmanın üç yolu

YöntemHangi günü seçer?Zayıf noktası
MAX(StokGorunum[Tarih]) ile (hazır [Stok Adedi])Görünen dönemde kaydı olan son günBir ürün son ayda kaydedilmediyse o ürün kapanışta yok olur
LASTNONBLANK(Tarih[Tarih], …) (hazır [Stok Değeri])İfadenin boş olmadığı son günAynı sorun; ürün bazında çözüm için SUMX(VALUES(Urunler[UrunNo]), …) gerekir
CLOSINGBALANCEMONTH / YEARTakvimin son günü (ay ya da yıl sonu)O gün kayıt yoksa boş döner; ayın ortasına kadar süzülmüş bir dönemde bile ay sonunu getirir

Bu modelde her ürünün her ay sonunda kaydı olduğu için üç yöntem aynı sayıyı verir. Gerçek hayatta öyle olmaz: yeni açılan bir ürün, satıştan kalkan bir ürün ya da geç gelen bir depo dosyası farkı ortaya çıkarır. Bir kenar durum daha: kullanıcı tarih dilimleyicisinde 1–15 Aralık 2024’ü seçerse [Stok Adedi] BLANK döner, çünkü bu günlerde görüntü yok. CLOSINGBALANCEMONTH ise 31 Aralık değerini getirir, yani seçilen dönemin dışındaki bir günü. İkisinden hangisi doğru, rapor sahibinin kararıdır. Ama kararı bilinçli ver ve görsel başlığına yaz.

Açılış, kapanış ve hareket mutabakatı

Stok kontrolünün temel denklemi: Kapanış − Açılış = Giren − Çıkan. Görüntü ölçüsü ile hareket ölçüsünü yan yana koymak veri kalitesini test eder.

Yıllık Stok Değişimi =
VAR Kapanis = [Stok Adedi]
VAR Acilis = CALCULATE([Stok Adedi], PREVIOUSDAY(FIRSTDATE(Tarih[Tarih])))
RETURN IF(NOT ISBLANK(Acilis), Kapanis - Acilis)

2023’te stok 325’ten 309’a indi (−16), 2024’te 311’e çıktı (+2). 2022 satırı BLANK’tir: veri Ocak 2022’de başlıyor, açılış görüntüsü yok. IF(NOT ISBLANK(Acilis), …) bu yüzden var. Yoksa ölçü 2022’de “+325” gösterirdi, yani bütün stok o yıl gelmiş gibi.

2024’te depoya 1.489 adet girdi ([Gelen Adet]). Denklemden çıkan adet 1.489 − 2 = 1.487 olur. Oysa [Satılan Adet] 1.426. Aradaki 61 adet fire, iade, sayım farkı ya da veri hatasıdır. Böyle bir fark rapordan önce tedarik ekibine sorulacak bir sorudur. Bir stok raporunun en değerli satırı bazen bu mutabakat satırıdır.

Ortalama bakiye ve devir hızı

Stok devir hızı “stok yılda kaç kez yenileniyor?” sorusunu cevaplar: dönem maliyeti / ortalama stok değeri. Ortalama stok, ay sonu görüntülerinin ortalamasıdır:

Ay Sonu Ortalama Stok Değeri =
AVERAGEX(VALUES(Tarih[YilAy]), [Stok Değeri])

Yıllıklaştırılmış Stok Devri =
DIVIDE([Net Maliyet], [Ay Sonu Ortalama Stok Değeri])
    * DIVIDE(12, COUNTROWS(VALUES(Tarih[YilAy])))

2024: ortalama stok değeri 180.333 ₺, net maliyet 458.504 ₺, devir 2,54. Yıllıklaştırma çarpanı neden var? Tüm dönem satırında maliyet 36 ayın maliyetidir; çarpan olmadan sonuç “3 yıllık devir” olur ve yıllık sayılarla karşılaştırılamaz. Çarpanla tüm dönem 1,54. Kategori düzeyinde en hızlı dönen Kitap (2,36), en yavaş Spor (0,68). Spor’da ortalama 59.005 ₺’lik stok duruyor; nakit bağlayan kategori burası.

Eksik yıl2022’de devir 0,39 çıkar. Stok 12 ay boyunca var, ama satışlar Haziran 2022’de başlıyor. Maliyet 7 ayın, ortalama stok 12 ayın. Bu bir iş sonucu değil veri sonucu; görselde not düş ya da yılı karşılaştırmadan çıkar.
Alıştırmalara geç (8)