Another year has gone by and it has now been 10 years since DAX was first introduced in late 2009. As usual, it is time to review the past year and to take a look at the year ahead.

New DAX functions and syntax in 2019

Microsoft released 13 new functions in 2019. The first 4 functions are related to the calculation group feature, which is now only available on Azure Analysis Services and Analysis Services 2019:

Chances are, you have never used the functions above. Calculation groups are not available in Power BI yet. They should be available once the Power BI XMLA endpoint is available in read-write mode, but there will still be limited adoption at that point. The real game changer is the availability of calculation groups in Power BI Desktop. The limited adoption of calculation groups is my biggest disappointment for 2019. But sooner or later this will happen – more about this later.

There is nothing groundbreaking about the other 9 functions: the same results were achieved with different syntax, or they cover some corner case that should not have a significant impact.

  • DISTINCTCOUNTNOBLANK: This is like DISTINCTCOUNT but ignores any blank value.
  • FIRSTNONBLANKVALUE: Returns the first non-blank value evaluated by an expression iterating the unique values in a column.
  • LASTNONBLANKVALUE: Returns the last non-blank value evaluated by an expression iterating the unique values in a column.
  • QUARTER: Returns the number of the quarter from a date.
  • CONVERT: Converts an expression in a specific data type.
  • REMOVEFILTERS: Removes filters like ALL, but it can be only used as a CALCULATE modifier and not as a table function.
  • ALLCROSSFILTERED: Removes all the filters propagated over any kind of relationship and not only those obtained by the expanded table. It can be only used as a CALCULATE modifier, so REMOVE probably would have been a better prefix than ALL. Luckily, this function is rarely required.
  • CONTAINSSTRING: Finds a string inside another string using limited wildcards; not case-sensitive.
  • CONTAINSSTRINGEXACT: Finds a string inside another string using a case-sensitive comparison; no wildcards allowed.

What SQLBI delivered in 2019

This year at SQLBI we delivered 34 public courses on three continents, plus many sessions in conferences, SQL Saturdays, and other community events.

We released the second edition of The Definitive Guide to DAX in August. For several reasons, we experienced delays in delivering the book outside of North America, especially in Europe. Hopefully, the problem seems to be solved by now. You can find more details about the content of the book and the “behind the scenes” on the blog post I wrote when the book was published.

We also launched the second edition of our Mastering DAX video course. New content, new demos, and many new exercises to practice on. Sometimes I receive requests about an advanced course… well, Mastering DAX is advanced, indeed! If you think we missed something, let us know. Thanks to the new organization, we made it possible to add modules over time. And if you are new to DAX, just enroll in the free Introducing DAX video course and only move on to Mastering DAX after you have completed it.

We continued to improve DAX Guide thanks to the contributions of many readers – if your feedback has not been applied yet… don’t worry, we didn’t lose it, it’s in the queue.

Finally, our OKViz spinoff released the first commercial custom visual, Smart Filter Pro. There have been many new versions and improvements of this visual, whereas the work on other new visuals will only be visible in 2020…

What’s coming in 2020

I’ve seen the future, and it’s bright – but unfortunately, it’s under NDA!

Well, I need to explain this. Daniele Perilli and I are now part of the Power BI contributor program. We will contribute to some Power BI features. We are not alone. And we all work for the community. Now, use your imagination, dream up something good and imagine it happening.

I know, you want to know more. Well, usually big conferences are used to make important announcements. The Microsoft Business Applications Summit in April should have good news. But if you can go to London for SQLBits 2020 a few weeks before, you might get a nice preview.

Besides, here is what we will do in 2020:

  • We will add a Calculation Groups module to the Mastering DAX video course. All the enrolled students will receive it for free.
  • We will release a new version of DAX Patterns. We started working on it in 2019 and we will complete the work in 2020. All the existing patterns will be refreshed with Power BI examples, more optimized DAX code, and we will also add new patterns. We wanted to release it in 2019, but the work on The Definitive Guide to DAX took longer than expected, so we had to delay the work on the patterns.
  • OKViz will release new custom visuals.
  • We will keep on producing content for SQLBI and tools for the community.

If you want to receive updates promptly without missing any news, go ahead and register to our newsletter.

Happy 2020!





Returns true if one of the specified measures is currently being evaluated.

ISSELECTEDMEASURE ( <Measure> [, <Measure> [, … ] ] )


Returns format string for the measure that is currently being evaluated.


Context transition

Returns the measure that is currently being evaluated.



Returns name of the measure that is currently being evaluated.



Counts the number of distinct values in a column.



Counts the number of distinct values in a column.

DISTINCTCOUNT ( <ColumnName> )

Context transition

Returns the first non blank value of the expression that evaluated for the column.

FIRSTNONBLANKVALUE ( <ColumnName>, <Expression> )

Context transition

Returns the last non blank value of the expression that evaluated for the column.

LASTNONBLANKVALUE ( <ColumnName>, <Expression> )


Returns a number from 1 (January-March) to 4 (October-December) representing the quarter.

QUARTER ( <Date> )


Convert an expression to the specified data type.

CONVERT ( <Expression>, <DataType> )

CALCULATE modifier

Clear filters from the specified tables or columns.

REMOVEFILTERS ( [<TableNameOrColumnName>] [, <ColumnName> [, <ColumnName> [, … ] ] ] )

CALCULATE modifier

Returns all the rows in a table, or all the values in a column, ignoring any filters that might have been applied.

ALL ( [<TableNameOrColumnName>] [, <ColumnName> [, <ColumnName> [, … ] ] ] )

Context transition

Evaluates an expression in a context modified by filters.

CALCULATE ( <Expression> [, <Filter> [, <Filter> [, … ] ] ] )

CALCULATE modifier

Clear all filters which are applied to the specified table.



Returns TRUE if one text string contains another text string. CONTAINSSTRING is not case-sensitive, but it is accent-sensitive.

CONTAINSSTRING ( <WithinText>, <FindText> )


Returns TRUE if one text string contains another text string. CONTAINSSTRINGEXACT is case-sensitive and accent-sensitive.

CONTAINSSTRINGEXACT ( <WithinText>, <FindText> )