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

Power BI ‘ın DAX Fonksiyonları: FILTER fonksiyonu

Merhabalar sevgili okur! Bu yazımızda Power BI ‘ın DAX fonksiyonlarından FILTER fonksiyonunu inceleyeceğiz. Bu fonksiyon da en çok kullanılanlarından. Önceki yazılarımızda bu fonksiyon gibi çok kullanılan temel fonksiyonlardan bahsetmiştik. Onların detaylarına da  buradan ulaşabilirsiniz.

Hemen ilk etapta kullanacağımız veri setinden bahsedelim. Yine kaggle.com’dan alacağımız veri seti Spotify’daki Top 50 şarkı ve bu şarkıların detaylarını içeriyor. Buradan indirebilirsiniz.

FILTER fonksiyonu, istediğimiz koşullara göre filtrelenmiş veri setleri oluşturmamıza olanak sağlar. Fonksiyon sonucunda bize bir tablo döndürür. Bu sebeple tablo fonksiyonları arasındadır. Yalnızca FILTER fonksiyonunu kullanacaksak, başka fonksiyonların içinde kullanmayacaksak, bu fonksiyon mutlaka New Table komutuyla kullanılmalıdır. Tekrardan hatırlatalım, Power BI arayüzünü Türkçe kullansak dahi DAX fonksiyonlarını İngilizce olarak kullanma zorundayız. FILTER fonksiyonunun söz dizimi şöyledir:

=FILTER(<İşlem Yapılacak Tablonun adı> , )

Bu iki parametrede mutlaka yazılmalıdır yoksa fonksiyon hata döndürür. Yapılacak filtreme işlemini biraz açarsak şu şekilde ifade edebiliriz. “<“, “>”, “=”, “<>” gibi matematiksel ibareler kullanılarak sonucunda doğru ya da yanlış ibaresinin döndürülmesi gerekir. Daha karmaşık filtreleme işlemleri için mantıksal operatörlerde (And & Or) kullanabilirsiniz.

İşe, Power BI ‘a bu veri setini aktarmakla başlayalım. Bunun için Giriş(Home) sekmesinde Veri Al (Get Data) seçeneklerinden Text/CSV seçerek bu veri setinin yolunu gösterelim. Bu .csv formatlı dosyayı almak için OK ‘a tıkladığınızda kendisi metinler arasındaki ayracı tanıyacak otomatik sütunlara bölünmüş halini Navigasyon penceresinde gösterecek. Burada Load diyerek verinin Power BI ‘a yüklenmesini sağlıyoruz.

Bu veri setinde FILTER fonksiyonuyla 2 yeni tablo oluşturacağız. Bunun için Modelleme sekmesinin altındaki Yeni Tablo komutuna tıklıyoruz.

1-Rakamsal İfadeler Kullanarak Filtreleme İşlemi

İlk tablomuz Dans edilebilirlik kapasitesi yüksek şarkılardan oluşacak. Bunu ana tabloda sorgulamamızı sağlayacak sütun Dancebility sütunu. Bu sütunda 80’i geçen değerleri listeyeceğiz. Bu filtreleme ifadesini yazmak için “>” matematiksel operatörü kullanacağız. Bir sütundaki satırlar için filtreleme işlemi yaptığımız için o sütunun ismini yazmamız yeterli olacaktır. Yazacağımız söz dizimi şöyle olacak:

Dans 80 ustu = FILTER(top50, top50[Danceability]>80)

2-Metinsel İfadeler Kullanarak Filtreleme İşlemi

İkinci tablomuz Pop şarkılarını listelemek olacak. Bunun için Genre sütununu kullanacağız. Bu sütunda yalnızca pop ibaresi geçen satırlar bizim için doğru olan satırlar olacak.

Pop_Sarkilar = FILTER(top50,top50[Genre]="pop")

Hem metinsel hem de sayısal ifadeleri kullanarak filtre kullanmış olduk. Dikkat ettiyseniz sayısal ifadeleri kullanırken sayıları çift tırnak içine almadık. Çift tırnak yalnızca metinlerde kullanılır. Asla unutmayın ki:

İki tek tırnak, çift tırnak yapmaz!

Tek tırnaktan kastım kesme işareti. Bazen karşılaştığımız durumlarda iki adet kesme işareti yanyana kullanılarak işlemler yapılmaya çalışıyor. Bilgisayar dilinde bu iki ifadenin yeri farklı olduğu için görüntüde doğru bile gözükse fonksiyon sonucu hatayla karşılaşırsınız. O yüzden bu konuda dikkatli davranmanızı tavsiye ederim.

Tüm bu işlemlerden elde ettiğimiz yeni tabloları rapor tarafına taşıma tarafına geldik. Ben filtre uyguladığımız sütunları getirdim öncelikle. Hemen sol tarafa da hiç filtre uygulanmamış tam sırayı koydum. İsterseniz bu dosyaya buradan ulaşabilirsiniz.

spotify top 50 report Bu yazımızda Power BI DAX fonksiyonlarından Filter fonksiyonunu inceledik. Başka yazılarımızda başka fonksiyonları, çeşitli sorunları, çıkmazları, yapılabilirlikleri incelemeye devam edeceğiz. Kendinize iyi bakın!

Good game well played.

Power BI’ın En Temel DAX Fonksiyonları

Merhaba, sevgili okur! Bu yazımızda Power BI ‘ın en temel DAX fonksiyonlarından bahsedeceğiz. Bu fonksiyonları gerçek hayatlarımızda da bol bol kullanıyoruz. Bu da bizlere gösterir ki, biz bunları rapor yaparken çok fazla kullanacağız.

Sakin olun ve en basitleri düşünün 😃 Evet, bahsedeceğim fonksiyonlar şöyle:

  • Sayma (COUNT)
  • Toplama (SUM)
  • Ortalama alma (AVERAGE)
  • Maksimum Değeri Bulma (MAX)
  • Minimum Değeri Bulma (MIN)

Bu fonksiyonların hepsi oldukça basit bir yapıya sahiptir. Burada aklımızdan çıkarmamamız gereken nokta fonksiyonları İngilizce olarak kullanma zorunluluğumuzdur. Unutmayın ki, arayüzü Türkçe de yapsak da fonksiyonları İngilizce kullanmak durumundayız. Genel olarak üstteki fonksiyonları ölçülerde(Measure) kullanırız. Ölçülerin sonuçları bize skaler tek bir değer verir. Biz de bu yazıda aşağıdaki soruların tek skaler bir değer olarak cevaplarını arıyoruz.

Bu fonksiyonların uygulanışı için örnek veri setini kaggle.com’dan aldım. Siz de buradan örnek veri setine ulaşabilirsiniz. Bu veri seti video oyunlarla ilgili isim, sıralama, platform, yıl, tür, yayıncı, dünya çapında satış gibi bilgileri içeriyor. Biz de üstte belirttiğimiz fonksiyonlarla veri setine sorduğumuz bazı soruların cevaplarını alacağız.

Başlangıç olarak Power BI ‘a bu veri setini aktaralım. Bunun için Home sekmesinde Get Data seçeneklerinden Text/CSV seçerek bu veri setinin yolunu gösterelim. Bu .csv formatlı dosyayı almak için OK ‘a tıkladığınızda kendisi metinler arasındaki ayracı tanıyacak otomatik sütunlara bölünmüş halini Navigasyon penceresinde gösterecek ve bize sadece Load demek kalacak.

Şimdiki aşamada bu veri setinden aşağıdaki soruların cevaplarını almak için çalışacağız.

1-Kaç adet oyun var?

İlk olarak bu konudaki merakımızı giderelim. Sayma işlemi için temel DAX fonksiyonlarından COUNT fonksiyonunu kullanarak veri setinde kaç adet oyun olduğunu saydıracağız. Herhangi bir sütunu bu işlem için kullanabiliriz. Genelde sayma işlemi yaparken asla boş olmayacağını bildiğimiz sütunları seçeriz.  COUNT fonksiyonu içine ilgili tablo ve sütun adını yazarak işlemimizi gerçekleştiriyoruz. Aşağıda ilgili söz dizimini bulabilirsiniz:

Oyun Sayisi = COUNT(vgsales[Name])

Bu fonksiyonu yazarak 16.598 adet oyundan bahsettiğimizi keşfetmiş oluyoruz.

2-Global_Sales sütunundaki değerlerin toplamı nedir?

Bir sütundaki değerlerin toplanmasından bahsediyorsak devreye bir başka temel DAX fonksiyonu olan SUM fonksiyonu girer. SUM fonksiyonunu kullanarak GlobalSales sütunundaki değerlerin toplamına erişmiş olacağız. Fonksiyonu kullanabilmemiz için mutlaka sayısal değerler içeren bir sütunu seçmemiz gerekmektedir. Bizim toplamını istediğimiz sütun, Decimal Number veri tipinde sayısal değerler içeriyor. SUM fonksiyonunun içine ilgili tablo ve sütun adını yazarak işlemimizi yapıyoruz. Aşağıda ilgili söz dizimini bulabilirsiniz:

GlobalSales Toplam = SUM(vgsales[Global_Sales])

Fonksiyonun sonucunda GlobalSales sütunundaki değerlerin toplamını 8920.44 olarak elde ediyoruz.

3-Global_Sales sütunundaki değerlerin ortalaması nedir?

Aynı sütun için bir de ortalama değerin ne olduğunu bulalım. Bir sütundaki değerlerin ortalamasından bahsediyorsak kullanacağımız fonksiyon AVERAGE fonksiyonudur. AVERAGE fonksiyonu kullanmak için de aynı SUM fonksiyonunda olduğu gibi mutlaka sayısal veri tipi içeren bir sütun tercih edilmelidir. AVERAGE fonksiyonunda üstteki diğer iki fonksiyon gibi tablo ve sütun ismini yazarak istediğimiz sonucu elde edebiliriz. Aşağıda ilgili söz dizimini bulabilirsiniz:

GlobalSales Ortalama = AVERAGE(vgsales[Global_Sales])

AVERAGE fonksiyonu bize cevap olarak 0.54 değerini verir. Bu veri setindeki oyunların ortalama satış fiyatı 0.54’müş.

4-NA_Sales sütunundaki değerlerin maksimumu nedir?

Bu sefer başka bir sütunda başka bir merakımız var. Acaba NA_Sales sütunundaki en büyük satış değeri nedir? Bu sorunun cevabını bize yalnızca MAX fonksiyonu verebilir. Tabii ki bu fonksiyonu kullanırken de ilgili sütunların sayısal değerler içermesi gerekiyor. Yalnız bu fonksiyon, söz diziminde bize iki seçenek sunar: bir sütun içinde maksimum değeri de bulabilir, iki skaler değerden hangisi büyükse onu da söyleyebilir. Biz burada seçimimizi tüm sütundaki maksimum değeri getirmesini isteyeceğiz. MAX fonksiyonunun genel kullanımı da bu şekildedir. Aşağıda ilgili söz dizimini bulabilirsiniz:

Maksimum NA_Sales = MAX(vgsales[NA_Sales])

Bu fonksiyondan edindiğimiz bilgilere göre NA_Sales sütunundaki maksimum değer 41.49 muş.

5-NA_Sales sütunundaki değerlerin minimumu nedir?

Bu da soracağımız son soru: NA_Sales sütunundaki en küçük satış değeri nedir? Bu sorunun cevabını almak için MIN fonksiyonunu kullanacağız. Kullanımı en büyük yerine en küçük değeri getirmek için kurgulanmışken, söz dizimi tamamen MAX fonksiyonu ile aynıdır. Genel kullanımı bir sütunun tamamında minimum değeri bulmak üzerinedir. Aşağıda ilgili söz dizimini bulabilirsiniz:

Minimum NA_Sales = MIN(vgsales[NA_Sales])

Bu fonksiyondan edindiğimiz bilgilere göre NA_Sales sütunundaki minimum değer 0 mış.

Son sorumuzla birlikte en temel DAX fonksiyonlarını kullanarak yukarıdaki sorulara cevap vermiş olduk.

DAX fonksiyon sonuçları

Dilerseniz bu işlemlerin yapılmış hali olan .pbix formatlı dosyayı da buradan indirebilirsiniz. Bir sonraki yazımıza kadar hoşça kalınız.

Good game well played.

 

Union Fonksiyonu – Power BI DAX

Bu yazıda gelin birlikte Union fonksiyonunu inceleyelim. Farklı satış bölgelerinden gelen ve tek bir raporda gösterilmesi gereken tablolarınızı birleştirmek  ya da  farklı tabloları aynı anda filtreleyebilmeniz için tablolardaki filtre ifadelerini içeren yeni bir tablo oluşturmak amacıyla Union fonksiyonu kullanılabilir.

Union fonksiyonu basit bir tablo birleştirme fonksiyonudur ancak her fonksiyonda olduğu gibi onda da  kullanırken bilmemiz gereken bazı özel durumlar var.

Union ile aşağıdaki TR ve USA isimli iki tabloyu birleştirelim.

 

 

Bu iki tabloyu birleştirmek için; modeling Sekmesi > New Table butonuna basarız ve formül çubuğuna tablo isimlerimizle aşağıdaki formatta formülü yazarız.

Yeni Tablo Adı = UNION (birleştirlecek tablonun adı ; birleştirilecek diğer tablonun adı;diğer tablo;diğer tablo….)

iki tablonun bilgileri yeni tablomuzda başlıkla beraber altalta gelmiş oldu.

 

Tabloların Sütun Adetleri Farklı Olursa ?

TR Tablosu tamamen ayı durumda ancak USA tablosunu PowerQuery üzerinden çoğaltıp USA_2 adında yeni bir tablo oluşturdum. Yeni tabloya Urun Kodu diye yeni bir sütun ekledim.

 

 

şimdi iki tabloyu birleştirmeyi deneyelim.

 

Bu sefer , USA tablosuna ekstra eklediğim “Urun Kodu” sütunu nedeniyle fonksiyon hata verdi. Çünkü UNION birleştirdiği her tablonun aynı sayıda sütuna sahip olmasını bekler. Bu nedenle UNION tercih edecekseniz sütun sayılarının aynı olmasına dikkat!

 

Union Fonksiyonu Kullanırken Sütun Başlıkları Aynı mı Olmalı?

Yine TR tablosunu sabit bırakıp USA tablosundan bir tane daha çoğalttım ve Toplam Tutar Kolon adını Tutar olarak değiştirdim. Dolayısıyla iki tabloda  son sütunların başlıkları birbirinden farklı hale gelmiş oldu.

 

Şimdi iki tabloyu birleştirelim. Sonuç aşağıdaki biçimde oldu. Yani başlıklar UNION ifadesinin içindeki ilk tablodan geldi. Union yeni oluşan tabloya,  her zaman formüldeki ilk tablonun sütun başıklarının adını verir.
UNION fonksiyonu Birleştirme esnasında bir başlık eşleştirme yapmaz. Dolayısıyla başlıkların isimlerinin aynı olmasına gerek yoktur. Ancak bu durumda başka önemli bir durum var, o zaman eşleştirme nasıl olacak? Union aslında eşleştirme de yapmaz, düz mantıkla altalta birleştirir. Dolayısıyla verilerin doğru sütunlarda birikmesi için tablolardaki sütun sıralamasının birleştirilecek olan diğer tablolarla aynı olması şart.

 

şimdi yukarıdaki TR ve USA tablolarına tekrar bakalım. Sütun sıralamasında iki tabloda şehir ve adetler aynı pozisyonda değil; Tr tablosu Ulke, Adet, Şehir ve Toplam Tutar sırasıylayken, USA tablosunda Adet ve Şehrin yeri ters ve işte bu nedenle işlem sonucunda da Adet kolonunda USA’ in şehir isimleri  gözüküyor. Bu şekilde veri türleri farklı olduğunda, ortaya çıkan veri tipi, veri tipi zorlama kurallarına göre belirlenir. Örneğin Adet kolonunun veri tipi artık Text ! Dolayısıyla adet toplamı almak istediğinizde, alan text olduğu için sonuç alamazsınız!

Eğer sütunların sırası aynı olursa, iki tablo aşağıdaki gibi sorunsuz biçimde birleşir.

 

O halde, Union fonksiyonu için şunları söyleyebiliriz;

Tablolarda sütun sayısı aynı değilse çalışmaz.

Birleşmiş Tablodaki sütun başlıkları her zaman Union fonksiyonunda yazdığınız ilk tablodan gelir.

Sütun başlıklarının birebir aynı olması şart değildir çünkü birleşimde esas olan sütunların yerleridir.

UNION Fonksiyonu her iki tabloyu filtreleyen ara tablo oluştururken ya da farklı bölgelerden gelen satışlar için rapor oluştururken de kullanılabilir demiştik. Farklı kullanım örnekleri için yeni yazılarda görüşmek üzere! Ha buarada UNION’ın yeterli olmadığı durumlar için Power Query altındaki Append Query’i de inceleyebilirsiniz!