POWER BI DAX NEDİR?

Excel'de yıllarca SUM, VLOOKUP yazdınız; Power BI'a geçtiğinizde aynı mantığı bekliyorsunuz ama sonuçlar beklediğiniz gibi gelmiyor. Neden basit bir toplam, filtre değiştiğinde bambaşka bir değer döndürüyor? Cevap DAX'ın çalışma şeklinde — hücre değil, tablo ve bağlam üzerinden düşünen bir dil ile karşı karşıyasınız.
1. DAX Nedir, Hangi İhtiyaçtan Doğdu?
DAX (Data Analysis Expressions), Microsoft'un Power BI, Power Pivot ve SSAS Tabular ürünleri için geliştirdiği formül ve sorgu dilidir. 2009'da Power Pivot ile birlikte Excel dünyasına girdi. Amaç netti: ilişkisel veri modelleri üzerinde Excel kullanıcısının tanıdığı fonksiyon sözdizimiyle hesap yapmasını sağlamak, ama SQL'in tablo bakışını da arkaya almak.
DAX bir programlama dili değildir; deklaratif bir ifade dilidir. Yani "şu sonucu istiyorum" yazarsınız, motor "nasıl üreteceğini" kendi planlar. Bu yüzden DAX yazarken algoritma değil, filtre bağlamı ve satır bağlamı düşünmek zorundasınız. Dilin tüm fonksiyon imzalarını ve davranışlarını resmi başvuru kaynağında inceleyebilir, tartışmalı noktalarda buraya geri dönebilirsiniz.
2. DAX, Excel Formülünden Nasıl Farklıdır?
Excel'de formül bir hücreye yazılır ve o hücredeki diğer hücreleri referans alır: =A2*B2. DAX'ta hücre kavramı yoktur. Onun yerine sütun ve tablo vardır. Bir DAX ifadesi her zaman bir bağlam içinde değerlendirilir.
Üç temel farkı netleştirmek gerekir:
- Referans birimi: Excel hücre, DAX sütun ya da tablo üzerinden çalışır.
- Bağlam: Excel'de A2 her zaman A2'dir. DAX'ta aynı measure, raporun farklı görselinde farklı sonuç verir; çünkü filtre değişmiştir.
- İlişkiler: Excel'de tablolar arası bağ kurmak için VLOOKUP gerekirken DAX, model ilişkilerini doğrudan kullanır.
RELATED()tek satır cevabı verir.
Bir örnek üzerinden bakalım. Excel'de toplam ciro için =SUM(F2:F1000) yazarsınız. DAX'ta karşılığı şudur:
Toplam Ciro = SUM(Satislar[Tutar])
İlk bakışta benzer görünür. Ama Power BI raporunda bu measure'ı yıla göre kırdığınızda, motor sizin için filtreyi otomatik uygular. Excel'de bunu yapmak için PivotTable veya SUMIFS gerekirdi. DAX'ta tek satır yeter.

3. Calculated Column ve Measure: Hangisi Ne Zaman?
Yeni başlayanların en sık karıştırdığı ayrım budur. İkisi de DAX ile yazılır ama davranışları taban tabana zıttır.
Calculated Column (Hesaplanmış Sütun)
Veri yüklendiğinde bir kez hesaplanır, modelin içine fiziksel olarak yazılır ve modelin boyutunu artırır. Satır bağlamında çalışır — her satır için ayrı bir sonuç üretir.
Tipik kullanım: Kar = Satislar[Tutar] - Satislar[Maliyet]. Bu sütun, her satış kaydı için kâr değerini saklar.
Measure (Ölçü)
Önceden hesaplanmaz. Raporda kullanıldığı her seferde, o anki filtre bağlamına göre yeniden hesaplanır. Modelin boyutunu büyütmez, sadece tanım olarak saklanır.
Tipik kullanım: Toplam Kar = SUMX(Satislar, Satislar[Tutar] - Satislar[Maliyet]). Hangi yılı, müşteriyi, ürünü seçerseniz seçin, ona göre toplanır.
Pratik bir karar kuralı şöyle özetlenebilir:
- Sonucu satır bazında görmek istiyorsanız ve bu değer dilimleyiciye bağımlı değilse → calculated column.
- Sonuç toplam, ortalama, oran gibi bir aggregate ise ve filtreye göre değişmesi gerekiyorsa → measure.
- Hem column hem measure ile yazılabiliyorsa, neredeyse her zaman measure tercih edilir; performans ve esneklik kazandırır.
4. Temel DAX Fonksiyon Aileleri
DAX'ta yüzlerce fonksiyon var ama büyük çoğunluğunu birkaç aile altında düşünmek öğrenmeyi kolaylaştırır:
- Aggregate: SUM, AVERAGE, MIN, MAX, COUNTROWS — temel toplamalar.
- Iterator (X'li olanlar): SUMX, AVERAGEX, MAXX — satır satır gezip sonra toplar. Calculated column mantığını measure içinde verir.
- Filtre: CALCULATE, FILTER, ALL, REMOVEFILTERS — filtre bağlamını değiştirir. DAX'ın kalbidir.
- Time Intelligence: TOTALYTD, SAMEPERIODLASTYEAR, DATEADD — tarih tabloları üzerinde dönem karşılaştırması yapar.
- İlişki: RELATED, RELATEDTABLE, USERELATIONSHIP — model ilişkilerini DAX seviyesinde kontrol eder.
Bu fonksiyonlar arasında CALCULATE tek başına ayrı bir başlığı hak eder; çünkü filtre bağlamını değiştirebilen tek fonksiyondur ve neredeyse her ileri DAX ifadesi bir noktada onu çağırır.

5. DAX Öğrenirken Tipik Hatalar
DAX'a yeni başlayanların düştüğü tuzaklar genellikle aynıdır:
- Her şeyi calculated column ile çözmeye çalışmak — model şişer, performans düşer.
- Measure içinde
SUMbeklerken implicit conversion yüzünden hata almak; iterator gereken yerde aggregate kullanmak. - CALCULATE içinde filtre yazmadan ALL kullanmak ve toplamı bütün modele yaymak.
- Tarih tablosu olmadan time intelligence fonksiyonlarını çağırıp boş sonuç almak.
- İki yönlü ilişki açıp filtre yönünü kaybetmek.
Bu hatalardan kaçınmanın en sağlam yolu, modelin yıldız şema (star schema) prensibiyle kurulmuş olması ve measure'ların açık bir tarih tablosu üzerinden çalışmasıdır.
6. Nereden Başlamalı?
DAX öğrenirken sırasıyla şu konuların üstünden geçmek tutarlı bir öğrenme eğrisi sağlar: önce veri modelleme ve ilişkiler, ardından temel aggregate fonksiyonları, sonra CALCULATE ve filtre bağlamı, en son time intelligence ve gelişmiş iteratörler. Yapılandırılmış bir öğrenme süreci için Power BI eğitimi içeriklerinden yararlanabilirsiniz; özellikle DAX bölümlerini sırayla takip etmek bağlam kavramının oturmasına yardımcı olur.
DAX, ilk hafta yorucu görünür; ama filtre bağlamı zihninizde oturduktan sonra, daha önce SUMIFS labirentlerinde kaybolduğunuz raporları tek satırlık measure'larla kurduğunuzu fark edersiniz. Excel formülünden DAX'a geçiş bir sözdizimi değişimi değil, bir düşünce biçimi değişimidir; ve bu değişim Power BI ile gerçek anlamda verimli çalışmanın eşiğidir.
Sıkça Sorulan Sorular
DAX bir programlama dili midir?
Hayır, DAX deklaratif bir ifade ve sorgu dilidir. Döngü, değişken atama veya akış kontrolü gibi prosedürel yapılar yoktur. Siz istediğiniz sonucu tanımlarsınız, motor hesaplama planını kendisi çıkarır. VAR anahtar kelimesi ile yerel değişken tanımlanabilir ama bu yine deklaratif yapının içinde kalır.
Calculated column ile measure arasındaki en kritik fark nedir?
Calculated column veri yüklenirken bir kez hesaplanır ve modele fiziksel olarak yazılır; satır bağlamında çalışır. Measure ise her görselde, o anki filtre bağlamına göre yeniden hesaplanır ve modelin boyutunu büyütmez. Toplamlar ve oranlar için measure, satır bazlı sınıflandırmalar için column tercih edilir.
DAX öğrenmek için önce SQL bilmek gerekir mi?
Zorunlu değildir ama yardımcı olur. SQL bilenler tablo bazlı düşünmeye alışkın olduğu için filtre bağlamını daha hızlı kavrar. Excel'den gelenler ise fonksiyon sözdizimine yakındır, ama hücre mantığından sıyrılmak biraz zaman alır. İkisi de DAX öğrenmeyi engelleyen bir altyapı değildir.
CALCULATE fonksiyonu neden bu kadar önemli?
CALCULATE, DAX'ta filtre bağlamını değiştirebilen tek temel fonksiyondur. Bir measure'ı farklı bir filtre altında çalıştırmak, mevcut filtreleri kaldırmak veya yeni filtre eklemek için kullanılır. Yıldan yıla büyüme, pazar payı, koşullu toplam gibi tüm gelişmiş hesaplamalar bir noktada CALCULATE üzerinden geçer.
Time intelligence fonksiyonları neden boş sonuç döndürebilir?
Çünkü bu fonksiyonlar, modelinizde sürekli ve eksiksiz bir tarih tablosu olmasını bekler. Eğer tarih sütunu doğrudan satış tablosundan kullanılıyorsa veya tarihlerde boşluk varsa, SAMEPERIODLASTYEAR gibi fonksiyonlar beklenen sonucu vermez. Önce bir tarih tablosu kurup ilişkilendirmek standart pratiktir.
DAX'ta SUMX ile SUM arasındaki fark nedir?
SUM tek bir sütunun değerlerini toplar ve sadece sayısal bir sütun bekler. SUMX bir iteratördür; tablo üzerinde satır satır gezer, her satır için verdiğiniz ifadeyi hesaplar ve sonuçları toplar. Tutar çarpı miktar gibi satır bazlı ifadeleri toplam olarak almak için SUMX gerekir.
DAX performansını ne etkiler?
Model tasarımı, sütun kardinalitesi, ilişki yönleri ve iteratör kullanımı en kritik etkenlerdir. Yıldız şema yerine kar tanesi şema, gereksiz calculated column'lar, yüksek kardinaliteli string sütunlar ve iç içe iteratörler sorguları yavaşlatır. Doğru veri tipi seçimi ve gereksiz sütunları modelden çıkarmak çoğu zaman büyük kazanç sağlar.


