- Ciao, friends. In this video, I want to show you how to create a simple date
table just using Power BI. Let's start with the model. I have a simple model, here, that only contains sales and customers. There are no dates anywhere, and I have disabled the
auto date time feature. Therefore, if I take the order date and I drop it in my report,
I'm just slicing day by day. And this is not the optimal choice. What I want to do is
being able to slice by year, quarter, month, and
to create my own date table. To do that, I need to create
a new calculated table and just write some DAX in order to customize it the right way. So, let's start from the beginning. We go here and we create a new table. We just name the table "date" and there is a function in DAX, which is named CALENDARAUTO,
that scans your model, all the date columns in your model, and builds a suitable date table that will hit all the years which are referenced by your dates. So, we can just use
CALENDARAUTO and, as you see, the result contains a new column, "date", that starts from 2008 and will end on the last day of the last year referenced in your sales table. Or, for instance, in any
date column in your model. As it is now, it only contains a date, so it's not really useful. What we need to do is to
enrich it with more code. We could create columns just by creating new calculated column using the UI, but we prefer to use DAX, so we write everything
in a single expression that we can copy and
paste wherever we need. There is a function in DAX, ADDCOLUMNS, that lets you create new
columns and add them to a table. Now, CALENDARAUTO returns a date. What if I want a new
column containing the year? Then, I need to provide, first of all the name of the column, and then, the expression
which will be evaluated in order to return the year. This is the first column, and you see we have a new
column containing the year. You need to proceed and
create, in this way, all the columns that you
need in your date table. For example, we need the year, we also need the month, so we use the format function, and we format the date as a month, and we also need the month number because we will want to sort
the months the right way. It's just seven lines and we already have the date, the year, the
month, and the month number. What if we want the quarter? Well, we can also add the quarter again using the FORMAT function and we format the date as slash quarter. Now, I already have a good date table that contains the year, the month, the month number, and the quarter and I can use it to slice the data. The thing is, I still need
to create a relationship. Now, in sales, I have my order date. I link it to the date
column in the date table. Now, I have the relationship set and I can remove the order date beside, not only remove. It's a good practice, that
of hiding this column, so that... you have no way of using it, at least, if you're a casual user, and then, I can start slicing by year. Now, as you can see, I'm slicing
by year, the sales amount. If I try to do that by month, too, you will see that the
result is not optimal. In fact, it shows April, August, December. The reason is, it is using
alphabetical sorting. What you need to do is sort
the months by month number. And there's a feature to do that. So, you need to select the month, go to sort by column, and
choose the month number. As soon as I do it, you will see that the months
will be sorted the right way, January, February, March, and so on. That's the reason why we created both the month and the month number. The same way, you can use the quarter and you can enrich this table with all the columns you might want. For example, you can add the
weekday, the week number, you can add all the columns
that you might need. Create hierarchies and do all the work. If you need a simple date table, this is the way to go. If you need a much more
complex date table, or if you want to see a very good example of how to build the ultimate date table, there is a tool in Power
BI that you can look at, which is the DAX Date Template. This is the URL that you need
to enter in order to find it and, from here, you can
download a Power BI template that contains the ultimate date table. A lot of DAX code that
contains the definition of nearly all the kind of
columns that you might ever need. You can use it as it is or you can use it to customize
your perfect date table. It also contains hierarchies
and all the structure. That's the ultimate point. We are showing, here the very
simple version of the DAX code very simple version of a date table. The last thing that I
want to show you is that, sometimes, CALENDARAUTO
creates too many dates. CALENDARAUTO scans all the
date columns in your model, including, for instance, the birth date or whatever date might be there. So it might be the case
that it goes too wide. It creates a large date table. It's not a good practice that
of having a large date table. You only need the dates
that you actually need. The years that you actually need. So, I can just create
a variable "Mindate", which contains the minimum
of sales order date, then I create a second variable. Let's call it "Maxdate", which contains the MAX
of sales order date. Actually, I don't want
the first and last date because I want the first and last year. CALENDARAUTO will take care
of selecting individual dates, so let's just extract the YEAR of the MAX, and the YEAR of the MIN. And then, I'm gonna use these
variables in the RETURN part, and I embed my CALENDARAUTO
inside a FILTER and I filter CALENDARAUTO where the YEAR of the date
is greater or equal to the Mindate and at the same time, the YEAR of the date is
less or equal to Maxdate. Okay. This code is not going to have any effect on this very simple model. But on a more complex model, or in a different data structure, this is extremely useful to restrict the days
to only what you need, and beside, your logic might
be even more complex than that. You might have different dates, you might have dates in the future, you might have any scenario. This, as a pattern, lets you choose the only
dates which are needed. The last touch, in order to
make it a perfect date table, is to mark it as a date table. If we select the date in the table tools, we have the mark as date table. You only need to check it
and to provide to the engine, an information about the column that contains a date in your table. A date table, to be a correct date table, needs to have one column of type date time containing the dates, and that column needs to be
unique through the entire table. By using mark as date table, you make sure that all time
intelligence calculation will work in a smoother way. You don't have to worry
about filter context, applying ALL, and doing
a lot of geeky stuff that Power BI, DAX, takes care of you, if you mark the table as a date table. Enjoy DAX!