DATTAX × DAX — Parity Guide
If you build measures in Power BI, switching platforms usually means relearning everything from scratch — and finding out too late that the function your KPIs depend on doesn't exist on the other side. This page removes that uncertainty: it shows, category by category, what from DAX (Data Analysis Expressions, from Power BI) already exists in DATTAX, how the functions map to each other, and what is still out of reach.
Canonical DAX reference: https://learn.microsoft.com/en-us/dax/dax-function-reference (250+ functions organized into 12 categories)
1. Where DATTAX stands today
DATTAX 2.0.0 — DAX parity ≈ 85%, after the language's four implementation phases. Coverage spans iterator X-variants, filter context with CALCULATE, table-valued time intelligence, table expressions, relationship navigation, statistical distributions, parent-child hierarchies and bitwise operations.
What's missing (~15%): active USERELATIONSHIP integration, advanced visual calcs (complex WINDOW frames), inline VAR/RETURN variables and page tooltips. All mapped to phase 5 (future).
Current state by category (DATTAX v2.0.0)
| Metric | DAX | DATTAX v2.0 | Coverage |
|---|---|---|---|
| Total functions | ~250 | ~210 | 84% ✓ |
| Aggregation (basic) | 22 | 18 | 82% ✓ |
| Aggregation X (iterator) | 11 | 11 | 100% ✓ |
| Filter / Context | 30 | 22 (CALCULATE, ALL, ALLEXCEPT, FILTER, KEEPFILTERS, REMOVEFILTERS, SELECTEDVALUE, HASONEVALUE, ISFILTERED) | 73% ✓ |
| Time Intelligence | 40 | 32 (DATESYTD/MTD/QTD/WTD, DATEADD, DATESBETWEEN, DATESINPERIOD, PARALLELPERIOD, SAMEPERIODLASTYEAR table, PREVIOUS/NEXT 5, STARTOF, ENDOF*, FIRSTDATE, LASTDATE) | 80% ✓ |
| Text | 21 | 20 | 95% ✓ |
| Math/Trig | 47 | 38 | 81% ✓ |
| Date/Time | 24 | 22 | 92% ✓ |
| Logical | 15 | 12 (IF, SWITCH, IFERROR, AND, OR, NOT, COALESCE, BLANK, TRUE, FALSE, ISBLANK, ISNUMBER) | 80% ✓ |
| Table Manipulation | 32 | 18 (DISTINCT, VALUES, UNION, EXCEPT, INTERSECT, TOPN, GENERATESERIES, CROSSJOIN, ROW, TREATAS, ADDCOLUMNS, SELECTCOLUMNS, SUMMARIZE, FILTER, COUNTROWS) | 56% |
| Statistical | 40 | 24 (NORM/BETA/CHISQ/T/POISSON/EXPON DIST+INV+RT, COMBIN, PERMUT, FACT, GEOMEAN, STDEV.S/P, VAR.S/P, PERCENTILE.INC/EXC, RANK.EQ) | 60% ✓ |
| Information | 42 | 14 | 33% |
| Parent-Child | 5 | 5 (PATH, PATHITEM, PATHITEMREVERSE, PATHCONTAINS, PATHLENGTH) | 100% ✓ |
| Relationships | 5 | 4 (RELATED, RELATEDTABLE, LOOKUPVALUE + JOIN pipe) | 80% ✓ |
| Bitwise | 5 | 5 (BITAND, BITOR, BITXOR, BITLSHIFT, BITRSHIFT) | 100% ✓ |
| Visual calcs | 4 | 4 (OFFSET, INDEX, WINDOW, RUNNINGSUM, RANK) | 100% ✓ |
✓ = parity sufficient for real BI use.
2. The families that power BI measures
2.1 Iterator X-functions — aggregate derivations, not just columns
In DAX, the X-variants (SUMX, AVERAGEX, COUNTX, MINX, MAXX, MEDIANX, PRODUCTX, GEOMEANX, COUNTAX, RANKX, PERCENTILEX.INC) take (table, expression) and evaluate the expression row by row:
SUMX(Sales, Sales[Quantity] * Sales[UnitPrice]) -- sums the "per-row total"
AVERAGEX(Sales, RELATED(Product[Margin]) * Sales[Amount])All 11 X-variants are available in DATTAX. The classic "revenue = quantity × price, summed row by row" measure works as you expect, without cluttering the pipeline with intermediate MUTATE + GROUP BY steps and without preventing the expression from becoming a reusable model measure.
2.2 CALCULATE and filter context — the heart of DAX
Each cell of a matrix or chart carries an implicit set of filters (row + column + page filters). CALCULATE is the mechanism that modifies that context before evaluating the expression:
SalesUS := CALCULATE(SUM(Sales[Amount]), Geography[Country] = "USA")
SalesAllProducts := CALCULATE([Sales], ALL(Product))DATTAX supports CALCULATE with the essential modifiers — ALL, ALLEXCEPT, REMOVEFILTERS, KEEPFILTERS, table-valued FILTER, LOOKUPVALUE, SELECTEDVALUE, HASONEVALUE, ISFILTERED. In DATTA BI dashboards, each visual's context (axis, legend and page filters) is applied automatically: your measures respond to the user's clicks just like in Power BI.
2.3 Table-valued time intelligence — YoY and MoM without rewriting the query
DAX time functions return date tables that CALCULATE consumes as a filter:
SalesYTD := CALCULATE(SUM(Sales[Amount]), DATESYTD(DimDate[Date]))DATTAX covers the main ones: DATESYTD/MTD/QTD/WTD, DATEADD, DATESBETWEEN, DATESINPERIOD, PARALLELPERIOD, SAMEPERIODLASTYEAR, PREVIOUS*/NEXT* (day, week, month, quarter and year), STARTOF*/ENDOF*, FIRSTDATE and LASTDATE. Beyond those there are native scalar shortcuts (YTD, MTD, QTD, GROWTH_PCT, ROLLING_AVG) — see the language reference.
2.4 DIVIDE — the pattern behind every financial KPI
Margem := DIVIDE([Receita] - [Custo], [Receita], 0)DIVIDE(a, b, alternate) returns the alternate value (or BLANK) instead of an error when b = 0. It is available in DATTAX — your KPIs don't break on a zero divisor.
2.5 Logic and conditionals
Margem = IF([Receita] > 0, ([Receita] - [Custo]) / [Receita], BLANK())
Faixa = SWITCH(TRUE(), [Idade] < 18, "Menor", [Idade] < 65, "Adulto", "Idoso")IF, SWITCH, IFERROR, AND, OR, NOT, COALESCE, BLANK, ISBLANK and ISNUMBER are all available. Semantics note: in DAX, BLANK is a special value; in DATTAX, BLANK is a semantic alias for null — ISBLANK and IS NULL are equivalent.
3. DAX catalog by category — what exists in DATTAX
Use the lists below as a map: bold marks the functions that are essential in real models.
3.1 Aggregation (22)
APPROXIMATEDISTINCTCOUNT, AVERAGE, AVERAGEA, AVERAGEX, COUNT, COUNTA, COUNTAX, COUNTBLANK, COUNTROWS, COUNTX, DISTINCTCOUNT, DISTINCTCOUNTNOBLANK, MAX, MAXA, MAXX, MEDIAN, MEDIANX, MIN, MINA, MINX, PRODUCT, PRODUCTX, SUM, SUMX
DATTAX coverage: 18 basics + the 11 X-variants complete.
3.2 Filter (30)
CALCULATE, CALCULATETABLE, FILTER, ALL, ALLCROSSFILTERED, ALLEXCEPT, ALLNOBLANKROW, ALLSELECTED, EARLIER, EARLIEST, FIRST, INDEX, KEEPFILTERS, LAST, LOOKUP, LOOKUPWITHTOTALS, LOOKUPVALUE, MATCHBY, MOVINGAVERAGE, NEXT, OFFSET, ORDERBY, PARTITIONBY, PREVIOUS, RANGE, RANK, REMOVEFILTERS, ROWNUMBER, RUNNINGSUM, SELECTEDVALUE, WINDOW
DATTAX coverage: 22, including every essential in bold.
3.3 Time Intelligence (40)
CLOSINGBALANCEDAY/WEEK/MONTH/QUARTER/YEAR, DATEADD, DATESBETWEEN, DATESINPERIOD, DATESMTD, DATESQTD, DATESYTD, DATESWTD, ENDOFMONTH/QUARTER/YEAR/WEEK, FIRSTDATE, LASTDATE, NEXTDAY/WEEK/MONTH/QUARTER/YEAR, OPENINGBALANCEDAY/WEEK/MONTH/QUARTER/YEAR, PARALLELPERIOD, PREVIOUSDAY/WEEK/MONTH/QUARTER/YEAR, SAMEPERIODLASTYEAR, STARTOFMONTH/QUARTER/YEAR/WEEK, TOTALMTD, TOTALQTD, TOTALYTD, TOTALWTD
DATTAX coverage: 32 of 40.
3.4 Text (21)
COMBINEVALUES, CONCATENATE, CONCATENATEX, EXACT, FIND, FIXED, FORMAT, LEFT, LEN, LOWER, MID, REPLACE, REPT, RIGHT, SEARCH, SUBSTITUTE, TRIM, UNICHAR, UNICODE, UPPER, VALUE
DATTAX coverage: 20 of 21.
3.5 Math/Trig (47)
ABS, ACOS/ACOSH/ACOT/ACOTH, ASIN/ASINH, ATAN/ATANH, CEILING, CONVERT, COS/COSH/COT/COTH, CURRENCY, DEGREES, DIVIDE, EVEN, EXP, FACT, FLOOR, GCD, INT, ISO.CEILING, LCM, LN, LOG, LOG10, MOD, MROUND, ODD, PI, POWER, QUOTIENT, RADIANS, RAND, RANDBETWEEN, ROUND, ROUNDDOWN, ROUNDUP, SIGN, SIN/SINH, SQRT, SQRTPI, TAN/TANH, TRUNC
DATTAX coverage: 38 of 47.
3.6 Date/Time (24)
CALENDAR, CALENDARAUTO, DATE, DATEDIFF, DATEVALUE, DAY, EDATE, EOMONTH, HOUR, MINUTE, MONTH, NETWORKDAYS, NOW, QUARTER, SECOND, TIME, TIMEVALUE, TODAY, UTCNOW, UTCTODAY, WEEKDAY, WEEKNUM, YEAR, YEARFRAC
DATTAX coverage: 22 of 24.
3.7 Logical (15)
AND, BITAND, BITLSHIFT, BITOR, BITRSHIFT, BITXOR, COALESCE, FALSE, IF, IF.EAGER, IFERROR, NOT, OR, SWITCH, TRUE
DATTAX coverage: 12, plus the 5 bitwise operations complete (BITAND, BITOR, BITXOR, BITLSHIFT, BITRSHIFT).
3.8 Table Manipulation (32)
ADDCOLUMNS, ADDMISSINGITEMS, CROSSJOIN, CURRENTGROUP, DATATABLE, DETAILROWS, DISTINCT, EXCEPT, FILTERS, GENERATE, GENERATEALL, GENERATESERIES, GROUPBY, IGNORE, INTERSECT, NATURALINNERJOIN, NATURALLEFTOUTERJOIN, ROLLUP, ROLLUPADDISSUBTOTAL, ROLLUPISSUBTOTAL, ROLLUPGROUP, ROW, SELECTCOLUMNS, SUBSTITUTEWITHINDEX, SUMMARIZE, SUMMARIZECOLUMNS, TOPN, TREATAS, UNION, VALUES
DATTAX coverage: 18 of 32 — the essentials in bold are present. Remember that many table operations also exist as pipe transformations (|> DISTINCT, |> UNION, |> GROUP BY).
3.9 Statistical (40)
BETA.DIST/INV, CHISQ.DIST/DIST.RT/INV/INV.RT, COMBIN, COMBINA, CONFIDENCE.NORM/T, EXPON.DIST, GEOMEAN, GEOMEANX, LINEST, LINESTX, MEDIAN, MEDIANX, NORM.DIST/INV/S.DIST/S.INV, PERCENTILE.EXC/INC, PERCENTILEX.EXC/INC, PERMUT, POISSON.DIST, RANK.EQ, RANKX, SAMPLE, STDEV.P, STDEV.S, STDEVX.P, STDEVX.S, T.DIST/2T/RT, T.INV/2T, VAR.P, VAR.S, VARX.P, VARX.S
DATTAX coverage: 24 of 40, including the NORM/BETA/CHISQ/T/POISSON/EXPON distributions with DIST, INV and RT.
3.10 Information (42)
COLUMNSTATISTICS, CONTAINS, CONTAINSROW, CONTAINSSTRING, CONTAINSSTRINGEXACT, CUSTOMDATA, HASONEFILTER, HASONEVALUE, ISAFTER, ISBLANK, ISBOOLEAN, ISCROSSFILTERED, ISCURRENCY, ISDATETIME, ISDECIMAL, ISDOUBLE, ISEMPTY, ISERROR, ISEVEN, ISFILTERED, ISINSCOPE, ISINT64, ISINTEGER, ISLOGICAL, ISNONTEXT, ISNUMBER, ISNUMERIC, ISODD, ISONORAFTER, ISSELECTEDMEASURE, ISSTRING, ISSUBTOTAL, ISTEXT, NAMEOF, NONVISUAL, SELECTEDMEASURE, SELECTEDMEASUREFORMATSTRING, SELECTEDMEASURENAME, TABLEOF, USERCULTURE, USERNAME, USEROBJECTID, USERPRINCIPALNAME
DATTAX coverage: 14 — the essentials in bold are present. The category includes many functions specific to the Power BI runtime that do not apply outside it.
3.11 Parent-Child (5)
PATH, PATHCONTAINS, PATHITEM, PATHITEMREVERSE, PATHLENGTH — 100% coverage. Hierarchies are represented as the string "1|2|3|4", useful for organizational structure reporting.
3.12 Relationships (5)
CROSSFILTER, RELATED, RELATEDTABLE, USERELATIONSHIP, TREATAS — DATTAX coverage: 4 of 5, with RELATED, RELATEDTABLE and LOOKUPVALUE, plus the pipe JOIN. TREATAS also exists in the language, counted under table manipulation. USERELATIONSHIP and CROSSFILTER are not supported yet.
4. DATTAX native vocabulary
Beyond the DAX-compatible names, the language keeps its own vocabulary, closer to SQL — useful when you are preparing data rather than writing measures:
| Family | Functions |
|---|---|
| Aggregations | SUM, AVG, MIN, MAX, COUNT, COUNT_DISTINCT, MEDIAN, COLLECT, FIRST, LAST |
| Text | CONCAT, UPPER, LOWER, TRIM, LENGTH, CONTAINS, NOTCONTAINS, STARTSWITH, ENDSWITH, SUBSTRING, REPLACE, SPLIT, REGEXEXTRACT |
| Math | ABS, ROUND, CEIL, FLOOR, SQRT, POWER, LOG, EXP |
| Date/time | NOW, TODAY, YEAR, MONTH, DAY, QUARTER, WEEKOFYEAR, DAYOFWEEK, DATEADD, DATEDIFF, DATEFORMAT, DATEPARSE |
| Scalar time intelligence | YTD, MTD, QTD, SAMEPERIODLASTYEAR, GROWTHPCT, ROLLINGAVG, MOVING_AVG |
| Window and ranking | ROWNUMBER, RANK, DENSERANK, LAG, LEAD, RUNNING_TOTAL, PERCENTILE |
| Statistics | STDDEV (with internal variance) |
| Others | COALESCE, CAST |
The IS NULL, IS NOT NULL, BETWEEN, NOT BETWEEN, IN and NOT IN operators are resolved internally by equivalent functions — you write them as ordinary language operators.
5. Practical example — translating a Power BI measure
Scenario: in Power BI you have a YTD revenue measure with a year-over-year comparison.
In DAX:
ReceitaYTD := CALCULATE(SUM(Vendas[Valor]), DATESYTD(DimData[Data]))
ReceitaYTD_AnoAnterior := CALCULATE([ReceitaYTD], SAMEPERIODLASTYEAR(DimData[Data]))In DATTAX, inside a model with defined measures:
DEFINE MEASURE receita_ytd =
CALCULATE(SUM(valor), DATESYTD(data)) ;
DEFINE MEASURE receita_ytd_ano_anterior =
CALCULATE([receita_ytd], SAMEPERIODLASTYEAR(data)) ;Step by step to validate:
- Open the editor at .
- Define the measures above over your sales dataset, adjusting the column names.
- Use the measures in an
EVALUATE ... GROUP BY regiao AGGREGATE ...and check the numbers against the original report. - When you use the same measures in a DATTA BI dashboard, each visual's filter context (axis, legend and page filters) is applied automatically.
6. What is not covered yet
- USERELATIONSHIP — activating alternative relationships of the semantic model.
CROSSFILTERhas the same dependency. - Advanced visual calcs — complex WINDOW frames, beyond
OFFSET,INDEX,RANK,WINDOWandRUNNINGSUM, which already exist. - Inline VAR ... RETURN — variables inside expressions; today the equivalent is
LETat the top of the script. - Page tooltips — a Power BI presentation feature, outside the language's scope.
These items are prioritized for phase 5. If any of them blocks your migration, raise the case with the platform team — the order is driven by real usage.
7. Design philosophy
- Pipes and functions, together. DAX is purely functional; M (Power Query) is pipeline-based — in Power BI they are two separate languages. DATTAX combines both:
|>for preparation and ETL, DAX-like functions inside expressions for measures. One language, two styles. - Filter context where it makes sense. The implicit filter context is activated in queries coming from a dashboard visual; ETL pipelines stay explicit and predictable.
- BLANK ≈ NULL. DAX treats BLANK as a special value; in DATTAX, BLANK is a semantic alias for null — behavior consistent with SQL.
- Iterators evaluate row by row. The X-variants take the expression and apply it to each row of the given table, which allows aggregating derivations without materializing intermediate columns.
8. References
- Official DAX reference: https://learn.microsoft.com/en-us/dax/dax-function-reference
- DATTAX language reference
- Language guide for users
- Platform BI workflow