PT EN
Back to site

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)

MetricDAXDATTAX v2.0Coverage
Total functions~250~21084%
Aggregation (basic)221882% ✓
Aggregation X (iterator)1111100% ✓
Filter / Context3022 (CALCULATE, ALL, ALLEXCEPT, FILTER, KEEPFILTERS, REMOVEFILTERS, SELECTEDVALUE, HASONEVALUE, ISFILTERED)73% ✓
Time Intelligence4032 (DATESYTD/MTD/QTD/WTD, DATEADD, DATESBETWEEN, DATESINPERIOD, PARALLELPERIOD, SAMEPERIODLASTYEAR table, PREVIOUS/NEXT 5, STARTOF, ENDOF*, FIRSTDATE, LASTDATE)80% ✓
Text212095% ✓
Math/Trig473881% ✓
Date/Time242292% ✓
Logical1512 (IF, SWITCH, IFERROR, AND, OR, NOT, COALESCE, BLANK, TRUE, FALSE, ISBLANK, ISNUMBER)80% ✓
Table Manipulation3218 (DISTINCT, VALUES, UNION, EXCEPT, INTERSECT, TOPN, GENERATESERIES, CROSSJOIN, ROW, TREATAS, ADDCOLUMNS, SELECTCOLUMNS, SUMMARIZE, FILTER, COUNTROWS)56%
Statistical4024 (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% ✓
Information421433%
Parent-Child55 (PATH, PATHITEM, PATHITEMREVERSE, PATHCONTAINS, PATHLENGTH)100% ✓
Relationships54 (RELATED, RELATEDTABLE, LOOKUPVALUE + JOIN pipe)80% ✓
Bitwise55 (BITAND, BITOR, BITXOR, BITLSHIFT, BITRSHIFT)100% ✓
Visual calcs44 (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:

dax
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:

dax
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:

dax
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

dax
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

dax
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:

FamilyFunctions
AggregationsSUM, AVG, MIN, MAX, COUNT, COUNT_DISTINCT, MEDIAN, COLLECT, FIRST, LAST
TextCONCAT, UPPER, LOWER, TRIM, LENGTH, CONTAINS, NOTCONTAINS, STARTSWITH, ENDSWITH, SUBSTRING, REPLACE, SPLIT, REGEXEXTRACT
MathABS, ROUND, CEIL, FLOOR, SQRT, POWER, LOG, EXP
Date/timeNOW, TODAY, YEAR, MONTH, DAY, QUARTER, WEEKOFYEAR, DAYOFWEEK, DATEADD, DATEDIFF, DATEFORMAT, DATEPARSE
Scalar time intelligenceYTD, MTD, QTD, SAMEPERIODLASTYEAR, GROWTHPCT, ROLLINGAVG, MOVING_AVG
Window and rankingROWNUMBER, RANK, DENSERANK, LAG, LEAD, RUNNING_TOTAL, PERCENTILE
StatisticsSTDDEV (with internal variance)
OthersCOALESCE, 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:

dax
ReceitaYTD := CALCULATE(SUM(Vendas[Valor]), DATESYTD(DimData[Data]))
ReceitaYTD_AnoAnterior := CALCULATE([ReceitaYTD], SAMEPERIODLASTYEAR(DimData[Data]))

In DATTAX, inside a model with defined measures:

dattax
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:

  1. Open the editor at DATTA BIDATTAX.
  2. Define the measures above over your sales dataset, adjusting the column names.
  3. Use the measures in an EVALUATE ... GROUP BY regiao AGGREGATE ... and check the numbers against the original report.
  4. 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. CROSSFILTER has the same dependency.
  • Advanced visual calcs — complex WINDOW frames, beyond OFFSET, INDEX, RANK, WINDOW and RUNNINGSUM, which already exist.
  • Inline VAR ... RETURN — variables inside expressions; today the equivalent is LET at 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

  1. 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.
  2. 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.
  3. BLANK ≈ NULL. DAX treats BLANK as a special value; in DATTAX, BLANK is a semantic alias for null — behavior consistent with SQL.
  4. 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