Power BI’da Dinamik Takvim Tablosu

Last updated on 29 Mart 2020
Merhaba, iyi günler.
Bugünkü yazımda Microsoft Power BI ile rapor ve pano hazırlarken kullanabileceğiniz merkezi bir Takvim-Tarih tablosunu adım adım sizlere aktarmaya çalışacağım.
Öncelikle tablomuzun merkezi sütununu oluşturacak yöntemi belirlememiz lazım.
Mevcut verilerimiz içerisinde takibini yapacağımız raporumuza yönelik bir “Tarih” formatı var ise;
Takvim = CALENDARAUTO()
Fonksiyonunu kullanmamız yeterli olacaktır.Bu fonksiyon minumum ve maksimum tarih formatındaki değerleri baz alıp ara değerleri otomatik oluşturur.
Herhangi bir tarih formatında değere sahip değilsek; bir başlangıç ve bir bitiş değeri ile otomatik bir şekilde tarih verisi oluşturabiliriz.
Ben ikinci yöntemi seçerek tarih formatında veri oluşturacağım.
Başlangıç değerini 01–01–2018, bitiş değerini ise TODAY() (mevcut bulunduğumuz) gün olarak baz alıyorum;
Takvim = CALENDAR(DATE(2018;01;01);TODAY())
Oluşturduğum verileri bir tablo üzerinde gösterecek olursam;

Sonrasında yapacağım tüm işlemleri, oluşturmuş olduğum bu merkezi ve dinamik olan (TODAY()’den dolayı) sütun üzerinden gerçekleştireceğim.
Öncelikle yeni bir sütün ekleyerek; (hatırlatma)

oluşturmuş olduğum tarih formatındaki alanı baz alarak yıl değerlerini bulacağım.
Bunun için YEAR() fonksiyonunu kullanacağım.
***YEAR(): Seçili tarih formatında bulunan yıl değerini sayısal geri döndürür.
Yıl = YEAR(Takvim[Tarih])
Ardından bir sonraki alt kırınım olan “Çeyrek” kavramını elde etmeye çalışacağım.
Bunun için QUARTER() fonksiyonunu kullanacağım.
***QUARTER(): Seçili tarih formatında bulunan çeyrek değeri sayısal olarak geri döndürür.
Çeyrek = QUARTER(Takvim[Tarih])
Oluşturduğumuz çeyrek ifadesi sayısal olarak görüntülendiğinden dolayı ifadesel olarak düzenlemede bulunmamız gerekebilir.
Burada Power BI içerisindeki yardımcı operatörlerden faydalanabiliriz.
Oluşturduğumuz sütuna “&” ile “.ÇEYREK” ekini dahil ederek sütunumuzu “1.ÇEYREK” gibi bir dönüşümle daha kullanılabilir hale getirebiliriz.
Çeyrek = QUARTER(Takvim[Tarih]) & ".ÇEYREK"
Akabinde ise MONTH() fonksiyonunu kullanarak “Ay” değerlerini bulacağım.
***MONTH(): Seçili tarih formatında bulunan değeri sayısal olarak ay değerinde geri döndürür.
Ay No = MONTH(Takvim[Tarih])
Benim bu ay değerlerini sayısal olarak kullanmam anlaşılırlık açısından problem olabilir. Ay numaralarına göre bu değerleri ifadelendirebilirim.
Burada SWITCH() fonksiyonunu kullanıp ilgili işlemi kolayca gerçekleştirebilirim.
***SWITCH(): Bir sütunu baz alarak; o sütunda bulunan belirli değerlere göre bir değer oluşturup döner.
Ay TR = SWITCH(Takvim[Ay No];
1 ; "OCAK";
2 ; "ŞUBAT";
3 ; "MART";
4 ; "NİSAN";
5 ; "MAYIS";
6 ; "HAZİRAN";
7 ; "TEMMUZ";
8 ; "AĞUSTOS";
9 ; "EYLÜL";
10 ; "EKİM";
11 ; "KASIM";
12 ; "ARALIK";
"")
NOT: İlk oluşturmuş olduğumuz [Tarih] sütunu hiyerarşik bir yapıdadır. [Tarih] yazıp “.” (nokta) operatörünü kullandığınızda [Year]-[Month]-[Day] alternatif kırınımlarını elde edebilrsiniz.
Örneğin;
Ay = Takvim[Tarih].[Month]
“Ay” değerinin ardından “Hafta” kırınımını elde edelim.Bunun için WEEKNUM() fonksiyonunu kullanacağız ve sonrasında “Çeyrek” üzerinde gerçekleştirdiğimiz operatör yardımı ile anlamlandırma işlemini burada da tekrarlayacağız.
***WEEKNUM() : Seçili tarih formatında bulunan yıl içerisindeki hafta değerini sayısal olarak geri döndürür.
Hafta = WEEKNUM(Takvim[Tarih]) & ".HAFTA"
“Yıl”,”Ay” ve “Hafta” değerlerine ulaştıktan sonra “Gün” için mevcut Takvim içerisindeki Tarih sütünunu kullanarak Power BI içerisindeki WEEKDAY() fonksiyonunu kullanacağım.
***WEEKDAY() : Seçili tarih formatında bulunan gün değerini sayısal olarak geri döndürür.
Gün No = WEEKDAY(Takvim[Tarih])
Oluşturduğumuz “Gün No” sütunu tam olarak kullanacağımız rapor içerisinde sağlıklı bir anlam ifade etmez.Bunun için “Ay TR” ‘de kullandığımız gibi SWITCH() fonksiyonundan yararlanarak gün isimlerini elde edeceğiz.
Gün = SWITCH(Takvim[Gün No];
1 ; "PAZARTESİ";
2 ; "SALI";
3 ; "ÇARŞAMBA";
4 ; "PERŞEMBE";
5 ; "CUMA";
6 ; "CUMARTESİ";
7 ; "PAZAR";
"")
Buraya kadar gerçekleştirdiğimiz işlemlere yönelik oluşturduğumuz sütunları bir tablo üzerinde görüntülersek;

Buradan sonraki gerçekleştireceğimiz işlemler, panolara yönelik “Bugün-Dün-Bu-Önceki” gibi ön ekler ile dinamik etiket bilgilendirmeleri sağlamak olacak.
Öncelikle “Bu Yıl” ve “Önceki Yıl” kavramlarına odaklanalım. Bunun için bazı faktörleri ele almamız gerekmektdir.
Burada Power BI içerisindeki IF() fonksiyonu ile işlemlerimizi kolayca gerçekleştieceğiz.
***IF()=Seçili sütun içerisindeki belirtilen koşula bağlı olarak değer döndürür. (Measure — Ölçü içersinde de kullanılır)
Fakat burada iç içe iki koşul kullanmamız gerekiyor.
Öncelikle “Bu Yıl”, sonrasında ise “Önceki Yıl” değerine ulaşıp, dışında kalan yıl değerlerini ise “Diğer” kavramı ile ifadelendirip işlemimizi gerçekleştirebiliriz.
BuYıl/ÖncekiYıl = IF(YEAR(Takvim[Tarih]) = YEAR(TODAY());"BU YIL";
IF(YEAR(Takvim[Tarih])+1 = YEAR(TODAY()-1);"ÖNCEKİ YIL";"DİĞER"))
NOT: Burada içi içe IF() değerlerini sayıca fazla kullanmak performans düşüklüğüne yol açabilir.Zorunluluk arz eden bir durum ise bu işlemi ana kaynak üzerinde gerçekleştirmek daha sağlıklı olacaktır.
Bknz: https://miracozturk.com/power-bi-rapor-performasina-yonelik-hatirlatmalar/
Yıl kavramlarının ardından “Bu Çeyrek” ve “Önceki Çeyrek” değerlerini ele alalım.
“Bu Yıl” ve “Önceki Yıl” algoritmasına ufak bir nüans farklı ile benzer bir şekilde IF() fonksiyonu ile işlemimizi gerçekleştirirsek;
BuÇeyrek/ÖncekiÇeyrek = IF(QUARTER(Takvim[Tarih]) = QUARTER(TODAY()) && Takvim[Tarih].[Year] = YEAR(TODAY());"BU ÇEYREK";
IF(QUARTER(Takvim[Tarih])+1 = QUARTER(TODAY()-1) && Takvim[Tarih].[Year] = YEAR(TODAY());"ÖNCEKİ ÇEYREK";"DİĞER"))
gibi bir çıkarım ile sonuca ulaşırız.
Nüans farkı ise; burada Çeyrek değerleri her yıl aynı olmasına binaen “BU-ÖNCEKİ” kavramları için mevcut yıl değerlerini de kontrol etmemiz gerekmektedir.
***Takvim[Tarih].[Year] = YEAR(TODAY())
Çeyrek ifadelerinin ardından sık kullanılan olarak ifade edilen ve pano etiketleri için filtreleme işlemlerinde yer alan “Bu Ay” ve “Önceki Ay” kavramlarına değinelim.
“Bu Çeyrek” ve “Önceki Çeyrek” algoritmaların da olduğu gibi yıl kontrolü gerçekleştirip, IF() ve MONTH() fonksiyonlarından yararlanacağız.
BuAy/ÖncekiAy = IF(MONTH(Takvim[Tarih]) = MONTH(TODAY()) && Takvim[Tarih].[Year] = YEAR(TODAY());"BU AY";
IF(MONTH(Takvim[Tarih])+1 = MONTH(TODAY()-1) && Takvim[Tarih].[Year] = YEAR(TODAY());"ÖNCEKİ AY";"DİĞER"))
Ardından ise, ay değerlerine benzer bir şekilde WEEKNUM() ve IF() fonksiyonlarından faydalanarak “Bu Hafta” ve “Önceki Hafta” değerlerine ulaşacağız.
BuHafta/ÖncekiHafta = IF(WEEKNUM(Takvim[Tarih]) = WEEKNUM(TODAY()) && Takvim[Tarih].[Year] = YEAR(TODAY());"BU HAFTA";
IF(WEEKNUM(Takvim[Tarih])+1 = WEEKNUM(TODAY()-1) && Takvim[Tarih].[Year] = YEAR(TODAY());"ÖNCEKİ HAFTA";"DİĞER"))
“Bu” ve “Önceki” kavramları için Çeyrek-Ay-Hafta kırınımlarında işlem yaparken ister istemez iç içe okunması zor (Ek olarak kirli görünüm içeren) işlemler gerçekleştirdik.
Bunları ayrı ayrı parametrelerde ele alınıp anlaşılır bir şekilde işlemler gerçekleştirmemiz mümkün.
İlerleyen yazı serilerinde bunları ele almaya çalışacağım.
Son olarak ise “Bugün” ve “Dün” değerleri kaldı.Burada algoritmamız oldukça sade olacak ve ek olarak TODAY() fonksiyonuna yer vereceğiz.
***TODAY():Mevcut gün değerini geri döndürür.(Datetime olarak; YYYY-MM-DD HH:MM:SS)
Bugün/Dün = IF(Takvim[Tarih] = TODAY();"BUGÜN";
IF(DATEADD(Takvim[Tarih];1;DAY) = TODAY();"DÜN";"DİĞER"))
“Bu” ve “Önceki” kavramlarını tamamlamış olduk.
Basit tabirler olarak gelebilir, fakat bu kavramlar üzerinden filtrelenen ve sonrasında panoya atılan öğeler rapor kullanıcıları tarafından çokça talep edilen yöntemlerdir.
Dinamik olarak veri karşılaştırmalarında da sıkça kullanılmaktadır.
Örneğin; ardışık iki yılın (Bu Yıl-Önceki Yıl) aynı çeyrek-ay-hafta içersindeki değer değişimlerini dinamik olarak panolar üzerinde kullanabilirsiniz.
Buradan sonra kuracağınız zaman kurgusu tamamen size (şirketinize) yönelik olmalıdır.
Örneğin;
1-Giyim firmaları (Giyim-Turizm…) gibi mevsim baz alınan şirketlerde tüm satış faaliyetlerine zaman kavramlarınızın etkin hitap etmesi adına “Mevsim” değerlerini dahil edebilirsiniz.
Mevsim = IF(Takvim[Ay No]=12 || Takvim[Ay No]=1 || Takvim[Ay No]=2 ;"KIŞ";
IF(Takvim[Ay No]=3 || Takvim[Ay No]=4 || Takvim[Ay No]=5 ;"İLKBAHAR";
IF(Takvim[Ay No]=6 || Takvim[Ay No]=7 || Takvim[Ay No]=8 ;"YAZ";
"SONBAHAR")))
2-İş gününü baz alan şirketler içerisinde hafta sonu cirosu üzerinden prim sağlanan yapılar için “İş Günü” değerlerini dahil edebilirsiniz.
İş Günü = IF(Takvim[Gün No]<=5;"HAFTA İÇİ";"HAFTA SONU")
3-Tahmini değer hesabı (Ciro-Kâr vb.) adına, mevcut ayın bitimine ne kadar gün kaldığı (Mevcut ayın son günü) hesaplanabilir.
“Ayın Son Günü” değerini için EOMONT() fonksiyonundan elde edebiliriz.
***EOMONTH(): Mevcut ayın son gün değerini geri döndürür.
Ayın Son Günü = DAY(EOMONTH(Takvim[Tarih];0))
4-Mevcut yıl ile önceki yılın aynı “N.” günü belirli değerler (Ciro-Kâr vb.) üzerinden karşılaştırılabilir.
***DATEDIFF(): İki tarih arasındaki zaman değerini (yıl-çeyrek-ay-hafta-gün) geri döndürür.
Yılın N. Günü = DATEDIFF(DATE(YEAR(Takvim[Tarih]);1;1);Takvim[Tarih];DAY)+1
Son olarak oluşturmuş olduğumuz takvim tablosu için seçili tarih değerini kolay rapor kullanımı açısından (zaman dilimini) etiket üzerinde yazdıralım.
***SELECTEDVALUE(): Belirtilen sütun içerisindeki seçili değerini geri döndürür.
Seçili Tarih = SELECTEDVALUE(Takvim[Yıl]) & " " & SELECTEDVALUE(Takvim[Çeyrek]) & " " & SELECTEDVALUE(Takvim[Ay TR]) & " " & SELECTEDVALUE(Takvim[Gün])

Oluşturmuş olduğumuz takvim demomuza ait görünümü aşağıdaki gibidir.
Kaynak dosyası: https://github.com/miracozturk17/PowerBIChallenge
Gelecek yazılarda görüşmek üzere.
İyi çalışmalar…