Yet another post inspired by the BOBJ board. The idea is how to design a universe such that users could enter any date and get both the measure value for that period as well as YTD
. Since we want to make it easy for adhoc users we need to do some design work in the universe to make it easy for the users performing adhoc analysis.
So I figured the easiest approach would be to define a separate set of measures for YTD
similar to what I did for the YAGO computation in a previous post. So extending on the same example I followed a very similar approach and it turns out to be quite simple. All we need to do is make sure we are able to run multiple queries, At least once for getting the sales and another one that sums up the sales from the beginning of year to the selected date. So I know we have to define a separate context for the YTD
sales, forcing the BI Server to automatically run 2 queries and join the results. Thats what I want to leverage.
1. To make my life easier in the universe I defined a separate reference table DATES_PERIOD
that maps the date to its corresponding YTD
start and end dates. This not only makes it simple, it also makes it possible for me use the same design for handling non standard calendars such as Fiscal calendar. Also if I want to do QTD
or MTD
instead of YTD
I can use the same approach by just changing the start and end dates.
In this table I have gone ahead and filled up the start and end dates for YTD
for every date in the DATES_TABLE
my calendar table.
2. In my universe I first go ahead and define an alias for the fact table called YTD_SALES
. Now instead of joining it to my DATES_PERIOD
(date dimension) table I have joined it to my DATES_PERIOD
table using a complex join as shown below.
This ensures that I will always select all the sales from the time slice (start and end of YTD) rather than selecting a specific date. My universe is as shown below.
In my universe my time dimension objects such as Date or Qtr are driven by the DATES_TABLE
. So in order to tie everything up I have joined the DATES_PERIOD
to the DATES_TABLE
on the date. This ensures that when the user selects the date, the corresponding period will be selected from the DATES_PERIOD
and the BI Server will return the sales that fall in that period. This is the key part of the design.
Now I can setup up the rest of the joins with the rest of the dimension tables.
3. Now I have to define a new context for YTD as shown below. This is needed to make sure that when the user selects from Sales and YTD sales they are sent as separate queries.
After setting up the contexts I can define the YTD Sales revenue by pulling in the appropriate field from the YTD_SALES alias table.
Now checking to make sure that the logic is OK. I define 2 queries, YTD Sales till Dec 31-2004 and the sales for 2004. If the logic is correct both should come out same and it does.
Also I can pull them in the same query if I want. I know that there is a sale on 15-Mar-2004. Filtering on that date gives me both the sales value for that date as well as YTD sales.
The reason I love this design is because very versatile and it can be used for any period to date. The only thing to note is that it will work only if the user selects a date. If the user selects a Qtr or Month then the YTD value will be garbage. If you want to prevent this then you can force the user to select a date using a prompt.