Olmazsa Olmaz ! – Tarih Tablosu

Hangi iş zekası uygulamasını kullanırsanız kullanın, hepsinde ortak olan bir metrik grubu var; zaman karşılaştırmalarıyla ilgili metrikler. Yani "Satışlar Önceki Ay", "Satışlar Geçen Sene Aynı Dönem", "Satışlar Önceki Yıl", "Önceki Yıla Göre Artış" gibi, bir önceki aya göre, bir önceki periyoda vs. göre zaman dilimlerini karşılatırmamızı sağlayan metrikler.

DAX'ta tarihle ilgili işlemler ve hesaplamalar yapmamızı sağlayan iki farklı kategori var; birincisi "tarih ve zaman fonksiyonları" (date-time functions), ikincisi "time intelligence" fonksiyonları.

Tarih-zaman fonksiyonları genel olarak, "date" veri tipindeki bir sütunla ilgili tarih ve zaman bilgilerini döndürür. (Ne kadar açıklayıcı bir cümle!).  Örneğin; Today(), bugünün tarihini döndürür. Month (Today()); bugünün ait olduğu ayı döndürür.

Time Intelligence fonksiyonları ise, bir metriğin farklı zaman periyotlarındaki değerlerini bulmamızı, dolayısıyla zaman periyodu bazında metrik değerlerini karşılaştırabilmemizi sağlar. Örneğin satışların önceki aya göre artışını hesaplamak istiyorsak, [Satışlar] metriğinin bir ay önceki değerini gösterecek bir başka metriği hesaplayabilmemiz lazım ki, ikisinin farkını artış olarak gösterebilelim.

Önce Power BI'ın yerleşik olarak zaman ve tarihle ilgili ne sağladığından başlayalım:

Örnek modelde sadece bir tane tablomuz var: Satışlar tablosu. Satışlar tablosunda, veri tipi "date" olan, gün-ay-yıl formatında bir Tarih sütunu var. Tutar sütununu toplayan basit bir de "Satışlar" metriğimiz var.

Satışlar metriğini, Tarih sütunuyla birlikte sütun grafiğine ve matrise düşürdüğümüzde, modelde "Year", "Quarter", "Month", "Day" gibi yıl-çeyrek-ay bilgilerini gösteren sütunlar olmamasına rağmen, görsellerde olduğunu görüyoruz. Aynı zamanda görsele düşürdüğümüz "Tarih" sütununun altına "Year-Quarter-Month-Day" hiyerarşisi eklendi. Oysa sadece "Tarih" sütununu eklemiştik.

Bunun sebebi, Power BI'ın yerleşik olarak (built-in) bir Tarih tablosuna sahip olmasıdır. DAX Studio ile modele bağlandığımızda bu tabloyu ve yapısını görebiliriz.

Eğer modelinizde ayrı bir "Tarih" tablosu yoksa, tarih tipindeki sütunlar üzerinden yıl-çeyrek-ay bazında görseller oluşturmak için kullanabileceğiniz bir özellik. PBI'ın bu "built-in" tarih tablosu özelliğini ayarlardan (Files –> Options and Settings –>Options –> Data Load) açabilir ya da kapatabilirsiniz.

Güzel bir özellik gibi dursa da, ben size bu özelliği her zaman kapalı tutmanızı ve ayrı bir Tarih tablosu kullanmanızı önereceğim.

İki sebepten dolayı:

  • Time intelligence fonksiyonlarının doğru çalışabilmesi için bir Tarih tablosundan, her bir günün tarihini gösteren bir Tarih sütununu çağırmamız gerekiyor. Oysa bu yerleşik tablonun adının ne olduğunu bile bilmiyoruz!
  • Time intelligence fonksiyonları için ayrı bir Tarih tablosu oluşturduğumuzda bu özelliği kapatmaz isek, yerleşik "görünmez" "internal" bir tablo olarak modelde yer işgal edeceğinden dosya büyüklüğünü arttırır.

Kısaca, bu özelliği ayarlardan her zaman kapatın ve kendi tarih tablonuzu oluşturun.

Yazının ana konusuna nihayet geldik: Tarih tablosunu nasıl oluşturacağız?

Üç farklı yöntem kullanabiliriz:

  • CALENDAR(), CALENDARAUTO() gibi DAX komutlarını kullanabiliriz. Yazıyı çok uzatmamak adına bu komutların kullanımına çok girmeyeceğim ama, CalendarAuto(), modelinizdeki tüm tablolardaki veri tipi "date" olan sütunlara bakar ve bu sütunlardaki en küçük ve en büyük tarihe göre ardışık olarak tüm gün tarihlerini içeren  tek sütunluk  bir Tarih tablosu oluşturur.
  • PowerQuery ile -yani M dili ile- kendi Tarih tablomuzu oluşturabiliriz.
  • Önceden hazırlanmış Excel, Access veya SQL tablosu formatında bir Tarih tablosunu kullanabiliriz.

Üçüncü opsiyonu daha çok tercih ediyorum: çünkü özellikle belli tarih aralıklarının hangi dönemlere ait olduğunu daha kolay belirleyebiliyorum. Örneğin mağazacısınız ve anneler günü kampanyasında yaptığınız satışları diğer dönemlerle karşılaştıracaksınız: Anneler günü satışlarını hangi dönem aralığı olarak kabul edeceksiniz?  Anneler gününden önceki 7 günü mü? Yoksa 10 günü mü? Önceden hazırlanmış bir Tarih tablosu ile bunu kendiniz dilediğiniz gibi belirleyebilirsiniz.

Bir Tarih tablosunda bize lazım olabilecek sütunlar kabaca ekteki gibidir:

Kampanya dönemleri gibi şirkete özel olabilecek durumlar için biraz daha farklı -yarı manuel oluşturulmuş-  Tarih tabloları da kullanılabilir.

Power BI (pbix) ve Excel 2016 formatındaki "Tarih" tablolarını ekteki linklerde paylaşıyorum. Excel dosyası 2013-2020 yılları arası tüm tarihleri içeren statik bir tablo. PBI dosyası ise "kendi tarih aralığınızı" vererek kendi Tarih tablonuzu oluşturmanıza müsade eder.

Sadece kayıtlı üyeler görebilir. Giriş veya Üyelik için login.

PBI dosyasının PowerQuery tarafını açıp dilediğiniz başlangıç ve bitiş tarihlerini girip -mali yıl başlangıç ayıyla birlikte-  istediğiniz aralıkta bir Tarih tablosu oluşturabilirsiniz.

Ayrı bir "Tarih" tablomuz da artık olduğuna göre, özellikle "time intelligence" fonksiyonlarını kullanırken, Tarih tablosu üzerinde işlem yaparken uymamız gereken "altın" kuralları sıralayabiliriz:

  • Tarih tablosu "gün" seviyesinde (granularity) olmalıdır.  Ardışık tüm günleri içermelidir ve arada hiç bir boşluk olmamalıdır.  
  • Yıl (lar) seviyesinde bir tablo tanımlıyorsak,  ilgili yıllara ait tüm günler  tarih tablosunda olmalıdır. İlgili yıllara ait 365 günün tamamı olmalıdır.
  • Time intelligence fonksiyonlarını kullanırken asla ve asla transaction tablolarındaki tarih sütunlarını çağırmayın. Her zaman Tarih tablosunundaki gerekli sütunları çağırın.
  • Transaction tabloları ve Tarih tablosu arasında mümkün mertebe veri tipi "date" olan sütunlar arasında ilişkiler tanımlayın. Yapay, kompozit anahtar sütunları kullanmayın.

Linklerde verilen tarih şablonları ilk iki kuralı sağlar, diğer ikisine dikkat etmenizi şiddetle öneririm.

Yukarıdaki kurallara uyan "kusursuz" bir tarih tablosu, her veri modelinin olmazsa olmazıdır.