Bukan Sekadar Rumus: Seni Meramu Measure DAX yang Tangguh
Pernah nggak sih, kamu duduk di depan layar Power BI Desktop selama berjam-jam, menatap kursor yang berkedip di formula bar, dan merasa bahwa logika bisnis yang diminta atasan itu rasanya mustahil diterjemahkan ke dalam kode? Jujur saja, saya sering mengalami itu di tahun-tahun awal saya bersentuhan dengan DAX (Data Analysis Expressions). Ada kalanya kita merasa sudah menulis rumus yang benar, tapi angka yang muncul di kartu visual malah bikin dahi berkerut.
Menulis measure yang kompleks itu sebenarnya bukan soal seberapa banyak fungsi yang kamu hafal di luar kepala. Menulis DAX adalah soal bagaimana kamu memahami “perjalanan” data dari tabel mentah hingga menjadi sebuah angka tunggal di laporan. Ini lebih ke arah seni logika dan pemahaman konteks daripada sekadar coding. Di artikel ini, saya ingin berbagi cara saya “berdamai” dengan kompleksitas DAX, mulai dari cara berpikirnya sampai ke trik teknis yang sering saya pakai di proyek-proyek nyata.
1. Mengubah Pola Pikir: Dari Sel ke Filter
Kalau kamu berangkat dari dunia Excel (seperti saya dulu), hambatan terbesar biasanya adalah kebiasaan berpikir dalam format “sel” (A1, B2, dsb). Di DAX, lupakan itu. Dunia DAX bekerja dalam lingkup tabel dan filter context. Ini adalah fondasi yang paling krusial. Sebelum kamu mengetik satu huruf pun, tanyakan pada diri sendiri: “Data apa saja yang sedang dilihat oleh visual ini?”
Bayangkan Filter Context itu seperti sebuah corong. Saat kamu menyeret kolom “Kategori Produk” ke dalam tabel visual, kamu sebenarnya sedang memerintahkan Power BI untuk menyaring seluruh dataset hanya untuk kategori tersebut. Measure yang kamu buat akan dihitung di dalam corong yang sudah menyempit itu. Kegagalan memahami konteks filter inilah yang biasanya membuat measure kita menghasilkan angka yang aneh atau tidak akurat.
“DAX itu ibarat kamera. Filter context adalah lensanya. Kalau lensanya buram atau salah fokus, objek seindah apa pun (datamu) bakal kelihatan berantakan di hasil fotonya.”
2. Senjata Rahasia: Kekuatan Variabel (VAR)
Kalau ada satu hal yang paling merubah cara saya menulis measure, itu adalah penggunaan VAR. Dulu, saya sering menulis rumus yang panjangnya minta ampun, bersarang (nested) sampai lima tingkat, dan jujur saja, seminggu kemudian saya sendiri bingung itu rumusnya buat apa.
Menggunakan variabel punya tiga keuntungan besar yang langsung bisa kamu rasakan:
- Keterbacaan: Kamu bisa memberi nama pada potongan logika. Misalnya, daripada menulis rumus diskon langsung di dalam
SUMX, kamu bisa buat variabelVAR PersentaseDiskon = .... Jauh lebih manusiawi, kan? - Performa: Ini yang sering terlewat. Kalau kamu memanggil logika yang sama berulang kali di dalam satu measure, Power BI akan menghitungnya berkali-kali. Dengan VAR, Power BI menghitungnya sekali, menyimpannya di memori, lalu tinggal memakainya lagi. Variabel membantu mesin DAX bekerja lebih efisien dan laporan jadi lebih ringan.
- Debugging: Kamu bisa mengetes variabel satu per satu. Cukup ganti bagian
RETURNuntuk menampilkan nilai dari variabel tertentu saat kamu sedang mencari di mana letak kesalahannya.
Contoh perbandingannya begini:
-- Cara lama yang bikin pusing
Total Profit Margin =
DIVIDE(
SUM(Sales[SalesAmount]) - SUM(Sales[TotalProductCost]),
SUM(Sales[SalesAmount]),
0
)
-- Cara lebih elegan dengan VAR
Total Profit Margin (Better) =
VAR TotalSales = SUM(Sales[SalesAmount])
VAR TotalCost = SUM(Sales[TotalProductCost])
VAR NetProfit = TotalSales - TotalCost
RETURN
DIVIDE(NetProfit, TotalSales, 0)
Lihat bedanya? Cara kedua terasa seperti kita sedang bercerita, bukan sedang merapal mantra yang rumit.
3. Memahami CALCULATE sebagai “Remote Control”
Kalau DAX punya raja, maka namanya adalah CALCULATE. Fungsi ini adalah satu-satunya fungsi yang bisa memodifikasi Filter Context. Setiap kali kamu merasa butuh menghitung sesuatu yang ‘melawan’ filter yang sedang aktif di layar, pakailah CALCULATE.
Misalnya, kamu sedang melihat data penjualan per bulan, tapi kamu ingin membandingkannya dengan total penjualan sepanjang tahun. Di sinilah CALCULATE beraksi. Ia bisa “melepas” filter bulan yang sedang aktif dan melihat ke cakupan yang lebih luas menggunakan fungsi pembantu seperti ALL atau ALLSELECTED.
Skenario nyata: Atasan ingin melihat persentase kontribusi penjualan tiap cabang terhadap total nasional. Kamu butuh menghitung penjualan cabang (yang sudah terfilter) dibagi dengan penjualan nasional (yang filternya harus kita ‘paksa’ lepas).
% Kontribusi Nasional =
VAR SalesCabang = [Total Sales]
VAR SalesNasional = CALCULATE([Total Sales], ALL(Cabang[NamaCabang]))
RETURN
DIVIDE(SalesCabang, SalesNasional)
Di sini, ALL(Cabang[NamaCabang]) bertindak seperti instruksi: “Tolong abaikan filter apa pun yang ada di kolom NamaCabang saat menghitung SalesNasional.” Tanpa CALCULATE, kita tidak akan pernah bisa melakukan manuver filter seperti ini.
4. Iterasi dengan Fungsi “X” (The Iterators)
Banyak teman-teman pemula terjebak antara SUM dan SUMX. Aturan sederhananya begini: SUM itu untuk menjumlahkan satu kolom secara utuh. Tapi, kalau kamu butuh melakukan perhitungan baris demi baris terlebih dahulu sebelum dijumlahkan (misal: Harga Satuan dikalikan Jumlah Terjual di setiap transaksi), maka kamu butuh Iterator.
Fungsi-fungsi seperti SUMX, AVERAGEX, atau MAXX menciptakan apa yang kita sebut sebagai Row Context. Iterator akan menelusuri tabel baris demi baris, melakukan perhitungan yang kamu minta, menyimpannya di memori sementara, lalu di akhir barulah dia menjumlahkan (atau merata-ratakan) semuanya.
Hati-hati, menggunakan iterator pada tabel dengan jutaan baris bisa membuat laporanmu terasa berat. Tips dari saya: Coba hitung dulu di level granulasi terkecil yang memang diperlukan saja. Jangan melakukan iterasi pada tabel besar jika kamu bisa mendapatkan hasil yang sama dengan operasi kolom yang lebih sederhana.
5. Menangani Logika Waktu (Time Intelligence) yang Kustom
Fungsi bawaan seperti SAMEPERIODLASTYEAR atau TOTALYTD itu hebat, tapi seringkali dunia nyata tidak seindah itu. Bagaimana kalau perusahaan tempatmu bekerja punya kalender fiskal yang mulai di bulan April? Atau bagaimana kalau mereka punya definisi “Minggu” yang berbeda?
Di sinilah kita butuh membuat measure yang lebih kompleks dengan Date Table yang kuat. Jangan pernah mengandalkan fitur ‘Auto Date/Time’ bawaan Power BI jika ingin membuat measure yang kompleks. Buatlah tabel kalender sendiri.
Misalnya, untuk menghitung penjualan Year-to-Date (YTD) secara manual agar kita punya kontrol penuh, kita bisa menggunakan kombinasi CALCULATE dan FILTER:
Custom YTD Sales =
VAR MaxDate = MAX('Date'[Date])
VAR CurrentYear = YEAR(MaxDate)
RETURN
CALCULATE(
[Total Sales],
FILTER(
ALL('Date'),
'Date'[Year] = CurrentYear && 'Date'[Date] <= MaxDate
)
)
Dengan cara ini, kamu nggak cuma pasrah pada fungsi “ajaib” Power BI, tapi kamu benar-benar memegang kendali atas bagaimana filter waktu itu diaplikasikan.
6. Studi Kasus: Menghitung Customer Retention (Pelanggan Setia)
Mari kita coba sesuatu yang agak menantang. Misalkan bisnismu ingin tahu: “Berapa banyak sih pelanggan yang belanja di bulan ini, yang sebelumnya juga pernah belanja di bulan lalu?” Ini adalah metrik Retention yang sangat umum diminta.
Logikanya begini:
- Cari tahu siapa saja pelanggan di bulan ini (Context saat ini).
- Cari tahu siapa saja pelanggan di bulan lalu.
- Cari irisannya (pelanggan yang ada di daftar bulan ini DAN daftar bulan lalu).
Mari kita terjemahkan ke DAX:
Returning Customers =
VAR CustomersThisMonth = VALUES(Sales[CustomerID])
VAR CustomersLastMonth =
CALCULATE(
VALUES(Sales[CustomerID]),
PREVIOUSMONTH('Date'[Date])
)
VAR ReturningList = INTERSECT(CustomersThisMonth, CustomersLastMonth)
RETURN
COUNTROWS(ReturningList)
Perhatikan penggunaan VALUES. Fungsi ini mengambil daftar unik dari kolom tertentu (dalam hal ini ID Pelanggan). Lalu INTERSECT melakukan tugas berat membandingkan dua daftar tersebut. Menggunakan tabel virtual (seperti variabel yang berisi tabel) adalah kunci untuk menyelesaikan masalah bisnis yang rumit tanpa harus membuat kolom tambahan di database.
7. Optimasi: Jangan Biarkan Measure Menjadi “Beban”
Seiring bertambahnya kompleksitas measure, biasanya kecepatan rendering visual akan menurun. Saya sering melihat orang menggunakan FILTER(ALL(Tabel), ...) untuk hal-hal yang sebenarnya bisa diselesaikan dengan cara lebih sederhana.
Ingat, fungsi FILTER adalah iterator. Dia akan mengecek tiap baris. Kalau kamu punya 10 juta baris, dia akan mengecek 10 juta kali. Seringkali, kita bisa menggantinya dengan fungsi KEEPFILTERS atau cukup memasukkan kondisi langsung di dalam CALCULATE untuk performa yang lebih kencang.
“Measure yang benar bukan cuma yang menghasilkan angka yang tepat, tapi yang juga tidak membuat user-mu bosan menunggu visualnya muncul.”
Checklist: Sebelum Kamu Menganggap Measure-mu “Selesai”
Sebelum kamu menutup formula bar dan beralih ke tugas lain, coba cek dulu poin-poin berikut ini. Ini adalah kebiasaan yang selalu saya terapkan agar pekerjaan saya lebih sustainable dalam jangka panjang.
- Apakah saya sudah pakai VAR? Pastikan logika tidak berulang dan mudah dibaca oleh orang lain (atau dirimu sendiri di masa depan).
- Bagaimana kalau filternya kosong? Gunakan
DIVIDEuntuk menghindari error pembagian dengan nol, atau gunakanIF(ISBLANK(...))jika perlu. - Apakah Filter Context-nya sudah tepat? Coba tes measure tersebut di berbagai jenis visual (Tabel, Bar Chart, Slicer). Apakah angkanya tetap masuk akal?
- Apakah performanya oke? Jika visual terasa lambat, coba cek apakah ada penggunaan
FILTERyang berlebihan pada tabel besar. - Apakah penamaannya sudah jelas? Hindari nama seperti “Measure 1” atau “Total Baru”. Gunakan nama yang mencerminkan logika bisnisnya, misal “Total Penjualan (YoY Growth %)”.
Penutup: Teruslah Bereksperimen
Belajar DAX itu mirip seperti belajar bahasa baru. Di awal mungkin kita terbata-bata, sering salah grammar (sintaks), dan bingung dengan logikanya. Tapi percayalah, makin sering kamu bedah masalah bisnis dan mencoba menuangkannya ke dalam measure, instingmu akan makin tajam.
Jangan takut kalau measure pertama kamu nggak langsung jalan atau angkanya salah. Kesalahan dalam DAX adalah guru terbaik untuk memahami bagaimana data modelmu sebenarnya berinteraksi. Setiap kali kamu berhasil memecahkan satu logika yang sulit, kamu sebenarnya baru saja naik level dalam memahami struktur data.
Semoga pengalaman yang saya bagikan ini bisa membantu kamu merasa lebih percaya diri saat menghadapi tantangan DAX berikutnya. Tetap semangat mengolah data, dan jangan lupa untuk selalu menyederhanakan yang rumit, bukan malah sebaliknya.



