Stop reading examples. Try them.
Most Power BI references show you a formula and a result and leave it at that. On the function pages below, you can edit the numbers yourself and watch the actual result recalculate — right on the page, no Excel, no upload, unlimited use.
Showing 75 of 75 examples
DAX
DIVIDE()
Set the denominator to 0 and watch the fallback trigger instead of an error.
IF()
Clear the false result and see the optional third argument actually return BLANK().
SWITCH(TRUE(), ...)
Reorder a condition and reproduce the exact shadowing bug the page warns about, yourself.
MID()
See the same substring need a different start number than Power Query’s Text.Middle().
ISBLANK() vs = 0
Watch BLANK() = 0 come back TRUE while ISBLANK() on that same 0 comes back FALSE.
TRIM()
Watch DAX collapse a double space between words while Power Query leaves it untouched.
DATEDIFF()
Watch a 1-day gap across January 31st return 1 for MONTH — it counts boundaries, not periods.
CALENDARAUTO()
Add an unrelated audit-log date column and watch it silently widen your whole date table.
DATEADD() vs PARALLELPERIOD()
Filter to just half a month and watch PARALLELPERIOD grab the whole prior month anyway.
UNION()
Swap a table’s column order and watch UNION() silently mix Amount values into the Region column.
TODAY() / NOW()
Watch a calculated column freeze at last refresh while a measure keeps counting the real days.
KEEPFILTERS()
Watch CALCULATE silently replace your visual filter, then fix it by ANDing instead of overwriting.
VALUES() vs DISTINCT()
Add an orphaned fact row and watch VALUES() grow an extra blank row that DISTINCT() never gets.
ADDCOLUMNS() vs SELECTCOLUMNS()
Watch SELECTCOLUMNS silently drop every column you didn’t explicitly list back in.
CROSSFILTER()
Filter the fact table and watch it do nothing to the dimension table — until CROSSFILTER lets it.
IFERROR()
Watch IFERROR catch a real error, then pass a BLANK() straight through untouched.
ALL() vs ALLSELECTED()
Pick a slicer region and watch ALLSELECTED track it while ALL ignores the selection entirely.
RANKX() — Skip vs Dense
Create a tie and watch Skip jump a rank ahead while Dense keeps counting with no gap.
TOPN() — Ties at the Cutoff
Ask for the Top 3 and watch a tie for last place hand back 4 rows instead.
USERELATIONSHIP()
Pick a month and watch Total Sales and Sales by Ship Date disagree on the same fact table.
LOOKUPVALUE()
Give two matching rows different prices and watch a real error appear, live.
RELATEDTABLE()
Switch off the relationship and watch a real order count silently become BLANK().
DISTINCTCOUNT() vs DISTINCTCOUNTNOBLANK()
Clear one cell and watch DISTINCTCOUNT quietly count "nothing" as its own value.
COUNTROWS() vs COUNT() vs COUNTA()
Type "N/A" into one cell and watch all three functions land on a different number.
SUMX()
Watch "sum of the products" and "product of the sums" land nowhere near each other.
SELECTEDVALUE()
Check a second box on a live slicer and watch it fall back instead of guessing.
EARLIER()
Drop EARLIER() from a rank calculation and watch every single row silently come out 1st.
COUNTX()
Leave a value blank and watch COUNTX() quietly count fewer rows than COUNTROWS().
Sort by Column
Mistype one Month Number and watch the calendar order break, live.
CALCULATE() + ALL()
Forget ALL() in a percent-of-total measure and watch every category read 100%.
CALCULATE() vs CALCULATETABLE()
Swap in a scalar expression and watch CALCULATETABLE() refuse it while CALCULATE() shrugs.
Measure Dependencies
Edit Total Sales once and watch Gross Profit and Profit Margin update automatically on top of it.
UDF val vs expr
Same ALL('Date') call, two parameter modes — one ignores it, one actually removes the filter.
SUMMARIZE()
Move one transaction to a different category and watch both group totals shift live.
FILTER()
Edit the sales values and watch a dynamic AVERAGE() threshold move right along with them.
Calculated Tables
Edit a product's Status and watch the calculated table stay stuck until you hit refresh.
Filter Context
Click one bar in a chart and watch two completely separate visuals update, with zero DAX changed.
Running Totals
Edit one month's sales and watch every running total after it shift, but never the ones before it.
Power Query M
Text.Middle()
Shift Start by one and watch the zero-indexing off-by-one happen on a live character ruler.
Text.Split()
Type two separators back to back and get a real empty-string element, not a skipped one.
Date.AddMonths()
Add a month to January 31st and watch it clamp to February 28th instead of erroring.
Text.Contains()
Flip a case-sensitive false into true with the Comparer.OrdinalIgnoreCase checkbox.
Text.Trim()
Swap in a non-breaking space and see it survive trimming, made visible on a character ruler.
try ... otherwise
Type anything that isn't a date and watch the fallback catch it instead of erroring.
Number.RoundUp() / RoundDown()
Round a negative number and see "up" mean away from zero, not toward positive infinity.
Date.From() locale ambiguity
Watch the same date text silently parse into two different days depending on locale.
Number.From() locale ambiguity
Watch "1.234,56" parse into two different numbers depending on the decimal separator.
error / try
Raise your own error and watch your exact message come back in [Error][Message].
Number.ToText()
Format 0.5 as "P" and watch it become "50.00%", not "0.50%".
null = null
See null = null return true in M — unlike SQL, where NULL = NULL is UNKNOWN.
Table.SelectColumns()
Request a column that doesn’t exist and watch it error — then fix it with MissingField.
Table.FirstN() vs SelectRows()
Watch FirstN stop at the first non-match and miss a later matching row entirely.
DateTime.LocalNow()
See your own browser’s local time vs UTC, right now — the exact gap a scheduled refresh hits.
Csv.Document()
See the raw Column1/Column2 output before Table.PromoteHeaders ever runs.
Table.SplitColumn()
Add a one-word name and watch the missing column fill with null, not an error.
Table.Sort()
Sort 10, 9, 2, 1 as text and watch "10" land right after "1" instead of after "9".
Table.Distinct()
Dedupe by CustomerID and watch a second email get silently discarded, not merged.
Table.AddIndexColumn()
See the default index start at 0, then set initialValue to 1 to fix it.
List.Distinct() & List.Contains()
Watch "Apple" and "apple" both survive List.Distinct() until you check the comparer box.
Merge Queries — Join Kinds
Switch from Left Outer to Inner and watch an unmatched customer silently vanish from the result.
Table.Group()
Type "bikes" instead of "Bikes" and watch it silently become its own extra group.
Table.Unpivot() vs UnpivotOtherColumns()
Add a new month column and watch a fixed-list unpivot silently leave it behind.
Table.ReplaceValue()
Leave a column off the search list and watch a real "N/A" survive with no warning at all.
Table.SelectRows()
Filter for "active" and watch "Active" and "ACTIVE" both get silently dropped.
Table.AddColumn() vs Table.TransformColumns()
Try reaching a second column from TransformColumns and watch it throw a real error every time.
Table.TransformColumns()
Lowercase one letter in the column name and watch the whole step fail, live.
List.Accumulate()
Swap the accumulator's parameter names and watch the final result land nowhere close.
List.Generate()
Flip < to <= in the condition and watch the sequence quietly gain one more item.
List.Transform() vs Table.AddColumn()
Same math, two shapes — one keeps the product name attached, one hands back a bare list.
Table.TransformColumnTypes() vs Table.TransformColumns()
Swap a type for a function between these two near-identical names and watch one of them break.
Recursive Functions
Edit n and watch a recursive Factorial() unwind, one call at a time, down to the base case.
Merge vs. Append
Mistype one ID column name and watch Table.Combine() silently double it, full of nulls.
Query Folding
Move one Custom Column step earlier and watch every step after it stop folding too.
Table.Buffer()
Re-evaluate a volatile source twice without buffering and watch the two references disagree.
M Case Sensitivity
Change one letter's case in a column or function name and watch M refuse to recognize it.
More on the way — see the changelog for what's new, or browse the full documentation.