Lab 4a - Create Advanced DAX Calculations in Power BI Desktop
Lab 4a - Create Advanced DAX Calculations in Power BI Desktop
in Power BI Desktop
Lab story
In this lab, you’ll create measures with DAX expressions involving filter context
manipulation.
Tip: By default, the Getting Started dialog box opens in front of Power BI
Desktop. You can choose to sign-in, and then close the pop-up.
2. To open the starter Power BI Desktop file, select the File > Open Report >
Browse Reports.
3. In the Open window, navigate to the D:\PL300\Labs\05-create-dax-
calculations-in-power-bi-desktop-advanced\Starter folder, and open
the Sales Analysis file.
4. Close any informational windows that may open.
5. Notice the yellow warning message beneath the ribbon.
This message alerts you to the fact that the queries haven’t been applied to load
as model tables. You’ll apply the queries later in this lab.
To dismiss the warning message, at the right of the yellow warning message,
select X.
The labs use a shorthand notation to reference a field or hierarchy. It will look
like this: Region | Regions. In this example, Region is the table name
and Regions is the hierarchy name.
You may recall that the Regions hierarchy has the levels Group, Country,
and Region.
7. To format the visual, in the Visualizations pane, select the Format pane.
10. Verify that the matrix visual now has four column headers.
At Adventure Works, the sales regions are organized into groups, countries, and
regions. All countries—except the United States—have just one region, which is
named after the country. As the United States is such a large sales territory, it’s
divided into five sales regions.
You’ll create several measures in this exercise, and then test them by adding
them to the matrix visual.
For your convenience, all DAX definitions in this lab can be copied from
the D:\PL300\Labs\05-create-dax-calculations-in-power-bi-desktop-
advanced\Assets\Snippets.txt file.
DAX
CodeCopy
Sales All Region =
CALCULATE(SUM(Sales[Sales]), REMOVEFILTERS(Region))
In this formula, the measure evaluates the sum of the Sales column in a
modified filter context, which removes any filters applied to the columns of
the Region table.
3. Notice that the Sales All Region measure computes the total of all region
sales for each region, country (subtotal) and group (subtotal).
The new measure is yet to deliver a useful result. When the sales for a group,
country, or region is divided by this value it will produce a useful ratio known as
“percent of grand total”.
4. In the Data pane, ensure that the Sales All Region measure is selected (when
selected, it will have a dark gray background), and then in the formula bar,
replace the measure name and formula with the following formula:
Tip: To replace the existing formula, first copy the snippet. Then, select inside the
formula bar and press Ctrl+A to select all text. Then, press Ctrl+V to paste the
snippet to overwrite the selected text. Then press Enter.
DAX
CodeCopy
The measure has been renamed to accurately reflect the updated formula. The
DIVIDE() function divides the Sales measure (not modified by filter context) by
the Sales measure in a modified context, which removes any filters applied to
the Region table.
5. In the matrix visual, notice that the measure has been renamed and that a
different value now appears for each group, country, and region.
6. Format the Sales % All Region measure as a percentage with two decimal
places.
7. In the matrix visual, review the Sales % All Region measure values.
8. Add another measure to the Sales table, based on the following expression,
and format as a percentage:
DAX
CodeCopy
Sales % Country =
DIVIDE(
SUM(Sales[Sales]),
CALCULATE(
SUM(Sales[Sales]),
REMOVEFILTERS(Region[Region])
)
)
9. Notice that the Sales % Country measure formula differs slightly from
the Sales % All Region measure formula.
The difference is that the denominator modifies the filter context by removing
filters on the Region column of the Region table, not all columns of
the Region table. It means that any filters applied to the group or country
columns are preserved. It will achieve a result that represents the sales as a
percentage of country.
You may recall that only the United States has multiple regions. All other
countries comprise a single region, which explains why they’re all 100%.
12. To improve the readability of this measure in visual, overwrite the Sales %
Country measure with this improved formula.
DAX
CodeCopy
Sales % Country =
IF(
ISINSCOPE(Region[Region]),
DIVIDE(
SUM(Sales[Sales]),
CALCULATE(
SUM(Sales[Sales]),
REMOVEFILTERS(Region[Region])
)
)
)
The IF() function uses the ISINSCOPE() function to test whether the region
column is the level in a hierarchy of levels. When true, the DIVIDE() function is
evaluated. When false, a blank value is returned because the region column isn’t
in scope.
13. Notice that the Sales % Country measure now only returns a value when a
region is in scope.
14. Add another measure to the Sales table, based on the following expression,
and format as a percentage:
DAX
CodeCopy
Sales % Group =
DIVIDE(
SUM(Sales[Sales]),
CALCULATE(
SUM(Sales[Sales]),
REMOVEFILTERS(
Region[Region],
Region[Country]
)
)
)
To achieve sales as a percentage of group, two filters can be applied to
effectively remove the filters on two columns.
DAX
CodeCopy
Sales % Group =
IF(
ISINSCOPE(Region[Region])
|| ISINSCOPE(Region[Country]),
DIVIDE(
SUM(Sales[Sales]),
CALCULATE(
SUM(Sales[Sales]),
REMOVEFILTERS(
Region[Region],
Region[Country]
)
)
)
)
17. Notice that the Sales % Group measure now only returns a value when a
region or country is in scope.
18. In Model view, place the three new measures into a display folder
named Ratios.
The measures added to the Sales table have modified filter context to achieve
hierarchical navigation. Notice that the pattern to achieve the calculation of a subtotal
requires removing some columns from the filter context, and to arrive at a grand total,
all columns must be removed.
1. In Report view, on Page 2, notice the matrix visual that displays various
measures with years and months grouped on the rows.
2. Add a measure to the Sales table, based on the following expression, and
formatted to zero decimal places:
DAX
CodeCopy
Sales YTD =
TOTALYTD(SUM(Sales[Sales]), 'Date'[Date], "6-30")
The function can also take a third optional argument representing the last date
of a year. The absence of this date means that December 31 is the last date of
the year. For Adventure Works, June in the last month of their year, and so “6-
30” is used.
3. Add the Sales field and the Sales YTD measure to the matrix visual.
4. Notice the accumulation of sales values within the year.
The TOTALYTD() function performs filter manipulation, specifically time filter
manipulation. For example, to compute YTD sales for September 2017 (the third
month of the fiscal year), all filters on the Date table are removed and replaced
with a new filter of dates commencing at the beginning of the year (July 1,
2017) and extending through to the last date of the in-context date period
(September 30, 2017).
Many Time Intelligence functions are available in DAX to support common time
filter manipulations.
1. Add another measure to the Sales table, based on the following expression:
DAX
CodeCopy
The Sales YoY Growth measure uses a variable. Variables help you simplify the
formula and are more efficient if using the logic multiple times within a
formula.
Variables are declared with a unique name, and the measure expression must
then be output after the RETURN keyword. Unlike some other coding language
variables, DAX variables can only be used within the single formula.
Now that the “difficult part” of the formula has been tested, you can overwrite
the measure with the final formula that computes the growth result.
5. To complete the measure, overwrite the Sales YoY Growth measure with this
formula, formatting it as a percentage with two decimal places:
DAX
CodeCopy
6. In the formula, in the RETURN clause, notice that the variable is referenced
twice.
7. Verify that the YoY growth for 2018 Jul is 392.83%.
The YoY growth measure identifies almost 400% (or 4x) increase of sales during
the same period of the previous year.
8. In Model view, place the two new measures into a display folder named Time
Intelligence.
Finish up
You’ll create a report based on the data model in the Design a Report in Power BI
Desktop lab.