DAX ile Tarih tablosu oluşturun!

Merhaba BI Fanları,

Bu yazımızda hemen her raporumuzda kullandığımız bir yapıdan bahsedeceğiz: Tarih Tablosu. Kullandığınız modelde bir tarih tablosu olmadığı için sizin mutlaka bu tabloyu oluşturmanız gerekiyor. Bu tabloyu oluşturmanın en önemli sebeplerinden biri Time Intelligence fonksiyonlarının kullanımıdır. Bu fonksiyonlar doğru çalışmak için atlanmadan tüm tarihlerin olduğu bir sütuna ihtiyaçları vardır. Bir diğeri ise birden fazla tabloyu aynı tarih aralığında filtrelemek istiyorsanız gene bir tarih tablosuna ihtiyacınız olur. Şimdi bunun nasıl oluşturabileceğimize bakalım.

Öncelikle Power BI’ın varsayılan olarak her tablo için bir tarih tablosu oluşturduğunu bilmemiz gerekiyor. Biz, bu tarih tablolarını raporda görmeyiz ancak ilgili tablodan tarih hiyerarşisine göre değer getirmeyi sağlayan bu tablodur. Bizim kontrolümüzde değildir ve tabloların boyutları büyüdükçe bu tarih tabloları da oldukça yer kaplayacağı için raporumuzda bize zorluk çıkaracaktır. Bu sebepten dolayı bunların kaldırılması gerekmektedir.  Bu tabloları Dax Studio’da görebilirsiniz.

 

Bu işlemi oluşturacağınız her rapor için yapmanız gerekmektedir. Rapor oluştururken en başta yaparsanız daha iyi olur, sonradan yaptığınızda raporunuzdaki görsellerde birtakım farklılıklar olabilir bunları da düzeltmeniz gerekmektedir.

File sekmesinde Options & Settings’e gelerek Options’a tıklıyoruz. “Time Intelligence” başlığı altındaki “Auto date/time” ifadesinin tikini kaldırıyoruz.

Şimdi yapmamız gereken bir date tablosu oluşturmak. Bunu DAX ile yapacağız. Fonksiyonları kullanmak için tarihlerin geçtiği tek bir sütun aslında bize yeterlidir. Tabii ki bizim analizlerimiz çeyrekleri, ay isimlerini, haftanın günlerini de kapsayabileceği için daha fazla detayı olan bir tabloya ihtiyacımız var.

Tarihleri oluşturmak için Modeling sekmesine gidip New Table’a tıkladıktan sonra Calendar fonksiyonu ile başlıyoruz:

CALENDAR(DATE(2021,1,1), DATE(2021,12,31))

Bu yapı bize 1 Ocak 2021 tarihi ile 31 Aralık 2021 tarihi arasındaki tüm tarihleri içeren tek sütunlu bir tablo döndürmüş olur.

Hemen sizlerden şunu duyar gibiyim: “Bunu dinamik oluşturamıyor muyuz?”. Tabii ki oluşturabiliriz. Bunun için bu ifadeye şöyle bir revize geçiyoruz:

CALENDAR(MIN(Table1[Tarih]), MAX(Table1[Tarih]))

 

Table1[Tarih]: Modelinizdeki en eski ve en yeni tarihlerin olduğu tablo. Bunlar iki ayrı tablo ve iki ayrı sütun da olabilirdi. Min ve max fonksiyonlarıyla en eski ve en yeni tarihleri buluyoruz.

Bundan sonrası için yıl, ay ve haftanın günü bilgilerini yeni bir sütun olarak ekleyelim:

Yıl = YEAR('Tarih Tablosu'[Date])

Ay no = MONTH('Tarih Tablosu'[Date])

Haftanın günü = WEEKDAY('Tarih Tablosu'[Date])

Hafta No = WEEKNUM('Tarih Tablosu'[Date],2)

 

Elimizde son durumda bulunan bilgiler bunlar:

Bunların yanına Format fonksiyonunu kullanarak birkaç metinsel bilgi de ekleyebiliriz:

Yıl/Ay = FORMAT ( [Date], "YYYY/MM" )

Tarih-sayı = FORMAT ( [Date], "YYYYMMDD" )

Yıl/Ay - Kısa = FORMAT ( [Date], "YYYY/MMM" )

Ay Adı - Kısa = FORMAT ( [Date], "MMM" )

Ay Adı - Uzun = FORMAT ( [Date], "MMMM" )

Haftanın günü - kısa = FORMAT ( [Date], "ddd" )

Haftanın günü - uzun = FORMAT ( [Date], "dddd" )

Çeyrek = FORMAT ( [Date], "Q" )

Yıl & Çeyrek = FORMAT ( [Date], "YYYY" ) & "/Q" & FORMAT ( [Date], "Q" )

Bu bilgilerden sonra tablom şöyle görünüyor:

Gördüğünüz gibi oldukça kapsamlı bilgiler içeren bir tarih tablom olmuş oldu. Şimdilik gözümüze bu yaptığımız işlemler zorlayıcı gelmiş olabilir. Çünkü her seferinde kodları taker taker yazmamız gerekiyor. Tak-çalıştır olarak kullanabileceğiniz Tarih tablosu kod bloğunu ise aşağıya yapıştırıyorum. Yeni tablo ekle dedikten sonra bu kodu yapıştırmanız ve min&max tarihleri alacağı tablo ve sütunu ilgili yere yazmanız yeterli olacaktır.

Tarih Tablosu= ADDCOLUMNS (
CALENDAR (MIN(Table1[Tarih]), MAX(Table1[Tarih])),
"Yıl" ,YEAR([Date]),
"Ay no" , MONTH([Date]),
"Haftanın günü" , WEEKDAY([Date]),
"Hafta No", WEEKNUM([Date],2),
"Yıl/Ay", FORMAT ( [Date], "YYYY/MM" ),
"Tarih-sayı", FORMAT ( [Date], "YYYYMMDD" ),
"Yıl/Ay – Kısa" , FORMAT ( [Date], "YYYY/MMM" ),
"Ay Adı – Kısa", FORMAT ( [Date], "MMM" ),
"Ay Adı – Uzun" , FORMAT ( [Date], "MMMM" ),
"Haftanın günü – kısa", FORMAT ( [Date], "ddd" ),
"Haftanın günü – uzun", FORMAT ( [Date], "dddd" ),
"Çeyrek", FORMAT ( [Date], "Q" ),
"Yıl & Çeyrek", FORMAT ( [Date], "YYYY" ) & "/Q" & FORMAT ( [Date], "Q" )

İngilizce başlıklar isteyenler de bunu kullanabilir:

Date Table= ADDCOLUMNS (
CALENDAR (MIN(Table1[Tarih]), MAX(Table1[Tarih])),
"Year" ,YEAR([Date]),
"MonthNo" , MONTH([Date]),
"DayofWeek" , WEEKDAY([Date]),
"Week Num", WEEKNUM([Date],2),
"Year/Month", FORMAT ( [Date], "YYYY/MM" ),
"Date as Integer", FORMAT ( [Date], "YYYYMMDD" ),
"Year/Month - Short" , FORMAT ( [Date], "YYYY/MMM" ),
"Month Name - Short", FORMAT ( [Date], "MMM" ),
"Month Name - Long" , FORMAT ( [Date], "MMMM" ),
"Day of Week - Short", FORMAT ( [Date], "ddd" ),
"Day of Week - Long", FORMAT ( [Date], "dddd" ),
"Quarter", FORMAT ( [Date], "Q" ),
"Year/Quarter", FORMAT ( [Date], "YYYY" ) & "/Q" & FORMAT ( [Date], "Q" )

 

Hatırlanması gerekenküçük bir nokta Ay isimlerini ve gün isimlerini ilgili ay no ve gün no sütunlarına göre sıralamanızdır. Bu sayede grafiklerinizde doğru sırada gözükecektir.

Başka yazılarımızda görüşmek üzere hoşça kalın.

Good game well played