Pernahkah Anda menatap kosong ke bar formula DAX di Power BI seperti sedang melihat bahasa alien? Tenang, Anda tidak sendiri. Saya juga pernah berada di posisi yang sama - terjaga hingga pukul 2 pagi, mencari-cari "cara menulis DAX" di Google, berharap dataset saya akan menjelaskan dirinya sendiri secara ajaib.
Tapi ada kabar baik: begitu Anda menguasai beberapa pola DAX yang powerful, Anda akan menyadari bahwa ini bukan sihir - hanya logika data dengan sedikit sentuhan khusus.
Saya bergelut dengan data, tak terhitung berapa kali formula DAX menyelamatkan proyek dan reputasi saya. Izinkan saya berbagi 20 formula DAX paling berharga yang tidak hanya menyelamatkan dashboard Power BI saya, tetapi juga menjaga kewarasan saya ketika deadline mendekat.
1. TOTALYTD - Karena Waktu Terus Berjalan
text
Total Penjualan YTD = TOTALYTD(SUM(Penjualan[Jumlah]), Kalender[Tanggal])
Cerita dari Lapangan: Masih teringat jelas ketika CEO perusahaan retail terbesar di Indonesia tiba-tiba meminta saya menunjukkan performa penjualan tahun berjalan dibandingkan target tahunan. Dengan satu formula TOTALYTD, saya bisa menampilkan data tersebut dalam hitungan detik, mengesankan semua orang di ruangan rapat.
Actionable Insight:
Selalu siapkan terlebih dahulu perhitungan Year-to-Date untuk metrik utama bisnis Anda. Ini adalah pertanyaan yang hampir pasti akan diajukan oleh manajemen, dan dengan mempersiapkannya sebelumnya, Anda terlihat sangat profesional.
2. CALCULATE - Pisau Swiss DAX
text
Penjualan Region Timur = CALCULATE(SUM(Penjualan[Jumlah]), Region[Nama] = "Timur")
Cerita dari Lapangan: Saat bekerja dengan retailer multi-cabang, saya perlu mengisolasi performa toko di Indonesia Timur yang mengalami penurunan. Dengan CALCULATE, saya bisa dengan cepat menampilkan angka penjualan spesifik untuk region tersebut dan mengidentifikasi bahwa masalah sebenarnya adalah keterlambatan pengiriman, bukan penurunan permintaan.
Actionable Insight:
Kuasai CALCULATE seperti Anda menguasai pernapasan. Ini adalah fungsi DAX paling serbaguna dan menjadi pondasi 70% formula kompleks lainnya. Latihan membuat 10 variasi CALCULATE berbeda untuk data Anda akan membuat pemahaman Anda tentang filter context menjadi solid.
3. FILTER - "Jika Ini, Maka Itu" untuk Tabel
text
Penjualan Nilai Tinggi = CALCULATE(SUM(Penjualan[Jumlah]), FILTER(Penjualan, Penjualan[Jumlah] > 1000000))
Contoh Konkret: Pada analisis e-commerce, saya menggunakan FILTER untuk mengisolasi transaksi bernilai tinggi (>Rp1 juta) dan menemukan pola bahwa 78% pembelian bernilai besar terjadi antara pukul 20:00-22:00, mengarah pada strategi flash sale malam yang sangat sukses.
Actionable Insight:
Buat "katalog FILTER" untuk bisnis Anda - kumpulan kode FILTER yang siap pakai untuk segmentasi data yang sering Anda gunakan (pelanggan VIP, produk margin tinggi, transaksi bermasalah).
4. PREVIOUSMONTH - Karena Perbandingan adalah Kunci
text
Penjualan Bulan Lalu = CALCULATE(SUM(Penjualan[Jumlah]), PREVIOUSMONTH(Kalender[Tanggal]))
Cerita Nyata: Selama pandemi, fluktuasi penjualan sebuah apotek online yang saya konsultasikan sangat tinggi. Dengan PREVIOUSMONTH, kami membuat dashboard yang secara otomatis menampilkan perbandingan dengan bulan sebelumnya, membantu mengidentifikasi dengan cepat kategori produk mana yang tumbuh atau menurun drastis.
Actionable Insight:
Kombinasikan PREVIOUSMONTH dengan visualisasi small multiples untuk membuat dashboard perbandingan yang powerful - tempatkan bulan ini dan bulan lalu berdampingan untuk setiap KPI utama.
5. SAMEPERIODLASTYEAR - Perbandingan YoY Tanpa Kerumitan
text
Penjualan Tahun Lalu = CALCULATE(SUM(Penjualan[Jumlah]), SAMEPERIODLASTYEAR(Kalender[Tanggal]))
Kisah dari Pengalaman: Ketika membantu brand fashion lokal menganalisis dampak kampanye Ramadhan, menggunakan SAMEPERIODLASTYEAR memungkinkan kami melihat bahwa meskipun penjualan selama Ramadhan meningkat 45%, pertumbuhan ini sebenarnya lebih rendah dibanding tahun lalu yang mencapai 60% - insight yang mengubah strategi promosi mereka.
Trik Praktis:
Buat selalu versi YoY untuk metrik utama Anda, lalu buat visualisasi "% Perubahan" menggunakan:
text
Perubahan YoY % = DIVIDE([Penjualan] - [Penjualan Tahun Lalu], [Penjualan Tahun Lalu], 0)
6. DIVIDE - Penyelamat dari Pembagian dengan Nol
text
Margin Keuntungan = DIVIDE(Penjualan[Profit], Penjualan[Pendapatan], 0)
Cerita Nyata: Dashboard pengeluaran marketing sebuah startup fintech terus crash karena pembagian dengan nol saat menghitung ROI dari kampanye baru yang belum menghasilkan pendapatan. DIVIDE dengan parameter ketiga "0" menyelamatkan dashboard dan memungkinkan tracking kampanye baru tanpa error.
Actionable Insight:
Audit formula DAX Anda yang mengandung pembagian dan ganti semua dengan DIVIDE untuk mencegah error. Parameter ketiga (fallback value) sebaiknya selalu diisi, biasanya dengan 0 atau BLANK().
7. RANKX - Karena Peringkat Penting
text
Peringkat Produk = RANKX(ALL(Produk[Nama]), SUM(Penjualan[Jumlah]), , DESC)
Pengalaman Pribadi: Saat mempresentasikan analisis saluran distribusi ke board of directors sebuah FMCG, mereka lebih tertarik pada "siapa 5 distributor teratas" daripada tabel panjang data. RANKX membantu saya menampilkan informasi ini dengan cepat, memfokuskan diskusi pada strategi nyata.
Actionable Insight:
Buat visual "Top N & Others" menggunakan RANKX untuk menyederhanakan dataset besar. Ini membuat laporan Anda lebih tajam dan mudah dicerna:
text
Top 5 Flag = IF(RANKX(ALL(Produk), [Total Penjualan],,DESC) <= 5, Produk[Nama], "Lainnya")
8. RELATED - Hubungkan Tabel Tanpa VLOOKUP
text
Kota Pelanggan = RELATED(Kota[NamaKota])
Contoh Nyata: Membangun model data penjualan multi-level untuk perusahaan distribusi dengan hierarki wilayah yang kompleks. RELATED memungkinkan saya menarik informasi hierarki wilayah ke tabel transaksi tanpa duplikasi data, membuat model 60% lebih efisien.
Tips Praktis:
Gunakan RELATED dalam calculated columns untuk "memperkaya" tabel fakta Anda dengan informasi deskriptif dari tabel dimensi, tetapi ingat bahwa ini meningkatkan ukuran model. Untuk kalkulasi dinamis, lebih baik gunakan RELATED dalam measures.
9. DATEDIFF - Ketika Waktu adalah Uang
text
Hari untuk Penyelesaian = DATEDIFF(Kesempatan[TanggalDibuat], Kesempatan[TanggalDitutup], DAY)
Kisah Nyata: Tim layanan pelanggan bank ternama kesulitan memahami mengapa resolusi tiket customer service mereka lambat. Dengan DATEDIFF, saya membuat visual distribusi waktu penyelesaian, mengungkap bahwa tiket yang dieskalasi ke departemen tertentu rata-rata tertahan 3x lebih lama.
Actionable Insight:
Buat scatter plot yang membandingkan "waktu penyelesaian" vs "nilai transaksi" untuk mengidentifikasi apakah ada korelasi antara nilai pelanggan dan kecepatan layanan.
10. DATEADD - Pergeseran Periode Tanpa Pusing
text
Penjualan Kuartal Lalu = CALCULATE(SUM(Penjualan[Jumlah]), DATEADD(Kalender[Tanggal], -1, QUARTER))
Pengalaman Nyata: Ketika membantu retailer multiformat menganalisis dampak promosi musiman, DATEADD memungkinkan kami membandingkan periode yang sama persis tahun lalu, mengungkap bahwa promosi "Awal Bulan" lebih efektif daripada "Akhir Bulan" di quarter 3.
Praktik Terbaik:
Untuk analisis seasonality, buat measures yang membandingkan dengan periode yang sama di masa lalu:
text
Q-o-Q Growth = DIVIDE([Current Quarter Sales] - [Previous Quarter Sales], [Previous Quarter Sales], 0)
11. CONCATENATEX - Selamat Tinggal Summary Membosankan
text
Daftar Produk = CONCATENATEX(VALUES(Produk[Nama]), Produk[Nama], ", ")
Contoh Kasus: Dashboard monitoring stok sebuah apotek menampilkan daftar obat yang hampir habis dalam format teks yang mudah dibaca, bukan tabel yang memakan tempat. CEO bisa langsung melihat "Paracetamol, Amoxicillin, Vitamin C" alih-alih scrolling tabel panjang.
Cara Kreatif Menggunakan:
Buat "kalimat insight otomatis" yang membuat data Anda berbicara:
text
Insight Teks = "Top performer bulan ini adalah " & CONCATENATEX(TOPN(3, VALUES(Produk[Nama]), [Penjualan]), Produk[Nama], ", ", Produk[Nama], DESC)
12. ALLSELECTED - Persentase yang Cerdas
text
% dari Total (Terfilter) = DIVIDE(SUM(Penjualan[Jumlah]), CALCULATE(SUM(Penjualan[Jumlah]), ALLSELECTED(Produk)))
Pengalaman Nyata: Dashboard regional sebuah bank menunjukkan pencapaian target per cabang, tapi manajemen ingin tahu kontribusi relatif setiap cabang dalam region yang dipilih. ALLSELECTED membuat persentase kontribusi dinamis, selalu berjumlah 100% dalam konteks filter apapun.
Insight Praktis:
Gunakan ALLSELECTED untuk membuat "total dinamis" yang beradaptasi dengan filter pengguna. Ini mencegah kebingungan ketika total tidak sesuai dengan yang diharapkan pengguna.
13. ISFILTERED - Berikan Visual Anda Kepribadian
text
Region Difilter? = IF(ISFILTERED(Region[Nama]), "Data Region Terfilter", "Semua Region")
Cerita dari Lapangan: Dashboard C-level sebuah perusahaan e-commerce sering disalahpahami ketika eksekutif lupa bahwa mereka telah menerapkan filter. Menambahkan indikator "Difilter/Tidak Difilter" dengan ISFILTERED mengurangi kesalahpahaman sebesar 80%.
Trik Cerdas:
Buat "watermark" dinamis di dashboard Anda yang menampilkan filter aktif:
text
Filter Status = "Filter aktif: " & IF(ISFILTERED(Produk[Kategori]), "Kategori, ", "") & IF(ISFILTERED(Region[Nama]), "Region, ", "")
14. HASONEVALUE - Untuk Title Card yang Dinamis
text
Produk Terpilih = IF(HASONEVALUE(Produk[Nama]), VALUES(Produk[Nama]), "Beberapa Produk")
Contoh Aplikasi: Dashboard performa manajer cabang bank yang memperlihatkan KPI individual ketika satu cabang dipilih, tapi menampilkan ringkasan perbandingan ketika beberapa cabang dipilih. HASONEVALUE membuat transisi ini mulus.
Implementasi Cerdas:
Kombinasikan dengan format kondisional untuk mengubah tampilan KPI berdasarkan jumlah item yang dipilih:
text
Card Title = IF(HASONEVALUE(Cabang[Nama]), "KPI untuk " & VALUES(Cabang[Nama]), "Perbandingan " & COUNTROWS(VALUES(Cabang[Nama])) & " Cabang")
15. SELECTEDVALUE - Ringkas dan Jelas
text
Region Terpilih = SELECTEDVALUE(Region[Nama], "Semua Region")
Kisah Nyata: Dashboard executive untuk jaringan retail dengan 500+ toko perlu adaptif tergantung toko mana yang dipilih. SELECTEDVALUE menyederhanakan conditional formatting dan judul dinamis, membuat dashboard langsung menampilkan nama toko yang dipilih tanpa logika kompleks.
Tips Implementasi:
SELECTEDVALUE lebih ringkas daripada kombinasi HASONEVALUE+VALUES. Gunakan untuk membuat elemen dinamis di dashboard:
text
Pesan Selamat Datang = "Selamat datang di dashboard " & SELECTEDVALUE(Store[Nama], "Semua Toko")
16. ALL - Reset Filter dengan Elegansi
text
Total Penjualan (Abaikan Filter) = CALCULATE(SUM(Penjualan[Jumlah]), ALL(Region))
Contoh Konkret: Dashboard regional bank menampilkan pencapaian cabang dibandingkan dengan target, tapi juga perlu menampilkan pencapaian terhadap total nasional. ALL memungkinkan menghitung total nasional meskipun user memfilter region tertentu.
Trik Advanced:
Gunakan ALL untuk membuat perbandingan "Part-to-Whole":
text
% dari Total Nasional = DIVIDE([Penjualan Region], CALCULATE([Penjualan Region], ALL(Region)), 0)
17. BLANK - Atasi Nilai Kosong dengan Elegan
text
Penanganan Null = IF(ISBLANK(Penjualan[Jumlah]), 0, Penjualan[Jumlah])
Pengalaman Pribadi: Dashboard inventory perusahaan manufaktur menampilkan "holes" ketika produk tidak terjual di hari tertentu. Menggunakan formula ISBLANK untuk mendeteksi dan mengatasi missing values membuat trend line menjadi mulus dan lebih mudah diinterpretasi.
Implementasi Cerdas:
Buat visualisasi yang membedakan antara "nol nyata" vs "data tidak ada":
text
Status Data = IF(ISBLANK([Penjualan]), "Data Tidak Tersedia", IF([Penjualan] = 0, "Tidak Ada Penjualan", "Ada Penjualan"))
18. SWITCH - Ucapkan Selamat Tinggal pada IF Bertingkat
text
Segmen Kategori = SWITCH(TRUE(), Penjualan[Jumlah] > 1000000, "Premium", Penjualan[Jumlah] > 500000, "Menengah", "Standar")
Cerita dari Lapangan: Segmentasi pelanggan untuk program loyalitas sebuah department store membutuhkan 7 tingkatan berbeda. Awalnya saya menggunakan IF bertingkat yang rumit, tapi beralih ke SWITCH membuat formula 60% lebih ringkas dan jauh lebih mudah dimodifikasi.
Teknik Praktis:
Gunakan SWITCH(TRUE(), ...) sebagai pengganti IF bertingkat. Ini membuat logika konditional Anda lebih bersih dan memudahkan pemeliharaan jangka panjang.
19. COUNTROWS - Sederhana tapi Powerful
text
Jumlah Pesanan = COUNTROWS(Penjualan)
Implementasi Konkret: Dashboard operasional sebuah fulfillment center e-commerce menggunakan COUNTROWS untuk tracking volume order real-time. Kombinasi dengan time intelligence functions memungkinkan perbandingan "volume hari ini vs kemarin pada jam yang sama" yang menjadi trigger otomatis untuk penambahan staf.
Teknik Lanjutan:
Gunakan COUNTROWS dengan FILTER untuk menghitung berdasarkan kriteria kompleks:
text
Pesanan Bermasalah = COUNTROWS(FILTER(Pesanan, Pesanan[Status] = "Delayed" || Pesanan[ComplaintFlag] = TRUE()))
20. USERELATIONSHIP - Karena Satu Model Bisa Punya Banyak Perspektif
text
Pendapatan berdasarkan Tanggal Pengiriman = CALCULATE(SUM(Penjualan[Pendapatan]), USERELATIONSHIP(Penjualan[TanggalKirim], Kalender[Tanggal]))
Pengalaman Nyata: Model data e-commerce dengan multiple date tables (order date, ship date, delivery date) awalnya membingungkan pengguna. USERELATIONSHIP memungkinkan kami membuat satu dashboard yang bisa diswitch antar perspektif tanggal, memberikan insight komprehensif tentang operasional.
Implementasi Praktis:
Saat model data Anda memiliki multiple date perspectives, buat measure untuk setiap perspektif dan visualisasi toggle yang memungkinkan pengguna beralih antar perspektif tanggal.
Final Thoughts
DAX bukan sekadar tentang syntax. Ini tentang bagaimana Anda berpikir tentang data - filter, relasi, konteks, dan logika. Begitu Anda memahami itu, Anda berhenti sekadar menulis formula dan mulai bercerita melalui data.
Jadi, baik Anda sedang membangun laporan untuk rapat direksi atau sekadar ingin mengesankan tim, 20 formula DAX ini seperti memiliki kode rahasia untuk Power BI.
Cobalah beberapa. Rusak mereka. Bangun kembali. Dan yang terpenting - jadikan mereka milik Anda sendiri.
Karena, seperti yang selalu saya katakan kepada analis : "Data tanpa DAX hanyalah angka. Data dengan DAX adalah cerita yang mengubah bisnis."
Glosarium DAX untuk Pemula
1. DAX (Data Analysis Expressions)
Bahasa formula dan kueri yang digunakan dalam Power BI, Power Pivot, dan SQL Server Analysis Services untuk membuat kalkulasi dan analisis data.
2. Measure
Kalkulasi yang dievaluasi secara dinamis berdasarkan konteks filter report. Berbeda dengan calculated column yang dihitung sekali dan disimpan dalam model.
3. Calculated Column
Kolom yang dibuat menggunakan formula DAX dan hasilnya dihitung sekali saat data diperbarui, kemudian disimpan dalam model data.
4. Filter Context
Lingkungan penyaringan di mana formula DAX dievaluasi, ditentukan oleh filter yang diterapkan pada visual atau report.
5. Row Context
Digunakan saat DAX mengevaluasi baris demi baris dalam ekspresi iterasi seperti SUMX atau kalkulasi pada calculated column.
6. Time Intelligence Functions
Kelompok fungsi DAX yang memungkinkan analisis data berdasarkan periode waktu, seperti TOTALYTD, SAMEPERIODLASTYEAR, dll.
7. Iterator Functions
Fungsi yang beroperasi pada tabel dan mengevaluasi ekspresi untuk setiap baris, seperti SUMX, AVERAGEX, MINX, dll.
8. Table Constructor
Metode untuk membuat tabel sementara dalam DAX menggunakan kurung kurawal, misalnya: { 1, 2, 3 } atau { ("Red"), ("Blue"), ("Green") }.
9. Relationship
Koneksi antara dua tabel dalam model data, biasanya menggunakan kolom kunci. Digunakan untuk menyebarkan filter antar tabel.
10. EVALUATE
Kata kunci yang diperlukan untuk memulai query DAX, diikuti oleh ekspresi tabel yang akan menghasilkan tabel hasil.
Citations:
- https://www.linkedin.com/pulse/22-powerful-dax-formulas-functions-beginners-deep-bi-samson
- https://learn.microsoft.com/en-us/power-bi/transform-model/desktop-quickstart-learn-dax-basics
- https://learn.microsoft.com/id-id/dax/dax-queries
- https://learn.microsoft.com/en-us/dax/dax-glossary
- https://learn.microsoft.com/id-id/dax/dax-glossary
- https://datasciencedojo.com/blog/data-analysis-expressions/
- https://learn.microsoft.com/en-us/dax/dax-queries
- https://www.kyvosinsights.com/glossary/dax-queries/
- https://www.beehexa.com/blog/25-power-bi-dax-formulas-n-functions/
- https://testbook.com/interview/power-bi-dax-interview-questions
- https://www.datacamp.com/cheat-sheet/dax-cheat-sheet
- https://learn.microsoft.com/id-id/power-bi/transform-model/dax-query-view
- https://blog.enterprisedna.co/using-ranking-dax-measures-to-extract-unique-insights-in-power-bi/
- https://learn.microsoft.com/en-us/dax/dax-function-reference
- https://www.youtube.com/watch?v=9fb1k3eS_u4
- https://stoneridgesoftware.com/power-bi-basics-turn-data-into-actionable-insights/
- https://www.youtube.com/watch?v=vm3NlQaEG0Y
- https://www.youtube.com/watch?v=fIZiBc7ev18
- https://www.upfrontoperations.com/blog/advanced-analytics-with-power-bi
- https://www.pythian.com/blog/technical-track/top-10-power-bi-dax-functions-for-efficient-data-analysis
- https://kelas.work/blogs/catat-formula-syntax-dan-variabel-pada-data-analysis-expressions
- https://radacad.com/basics-of-dax-expression-in-power-bi
- https://learn.microsoft.com/id-id/dax/dax-syntax-reference
- https://learn.microsoft.com/en-us/dax/dax-overview
- https://www.linkedin.com/pulse/dax-beginners-guide-understanding-data-analysis-expressions-asit-das-ekqmc
- https://institutocpe.edu.uy/wp-content/uploads/2020/03/DAX-Functions-List-Quick-Reference.pdf
- https://powerbi.id/glossary-powerbi/
- https://www.beehexa.com/blog/25-power-bi-dax-formulas-n-functions/
- https://en.wikipedia.org/wiki/Data_Analysis_Expressions
- https://www.linkedin.com/pulse/22-powerful-dax-formulas-functions-beginners-deep-bi-samson
- https://powerbi.id/tag/glossary/
- https://gcomsolutions.co.uk/common-dax-patterns/
- https://www.youtube.com/watch?v=PQ5lALdFHCU
- https://learn.microsoft.com/en-us/power-bi/transform-model/dax-query-view
- https://multishoring.com/blog/unlocking-dax-functions-in-power-bi/
- https://assets.datacamp.com/production/repositories/6027/datasets/35197e987758e15f94c6fc336e348f0bb54e71dc/DAX%20Cheatsheet.pdf
- https://dax.guide
- https://learn.microsoft.com/en-us/dax/
- https://databear.com/common-power-bi-dax-measures/