Table Functions in DAX: FILTER and ALL
What are table functions?
Table functions are functions in DAX that return a table. These are virtual tables inside of Power BI that are created using DAX functions, rather than tables that are physically within the data model. This blog post will explore two of the most common table functions – FILTER
and ALL
.
FILTER
The FILTER
table function is useful if you want to filter a table. The FILTER
function returns a sub-set of a table. To use the FILTER
function, you first specify a table name, followed by a condition. The condition is evaluated row by row on top the specified table and only the rows satisfying the condition will be returned as a result. So, the FILTER
function acts as both a table function and an iterator.
In order to illustrate how the FILTER
function works, we will create a new calculated table that is filtered to only return products from the 'Product' table with a colour of red.
Red Products = FILTER ('Product', 'Product'[Colour] = “Red”)
Here, the FILTER
function will evaluate every single row of the 'Product' table. For each row, if the 'Colour' column has a value of 'Red', this row will be included in the new calculated table as shown below.
Whilst this example illustrates how the FITLER
function operates, in practice, you typically want to use a table function to create a temporary table that is scanned and iterated by some other function. In other words, FILTER
is useful when you want to return the result of a calculation which is done over a subset of values from a table. For example, we can create a measure that uses FILTER
to show only the sales of products which are red.
Red Sales =
SUMX (
FILTER (
Sales,
RELATED ( 'Product'[Colour] ) = "Red"
),
Sales[Quantity] * Sales[Net Price]
)
Here, FILTER
is working on the 'Sales' table, but the 'Sales' table does not contain the product colour, so we want to use the function RELATED
. RELATED
gives you access to columns from other tables that have a relationship with the current table you are scanning.
For each sale in the 'Sales' table, the RELATED
function looks up the 'Colour' value in the 'Product' table. The result of this lookup is used by the FILTER
function to identify and return rows where the 'Colour' column has a value of 'Red'. This temporary table is then scanned and iterated by SUMX
to calculate the Sales[Quantity] * Sales[Price]
for each row in the table. This computation calculates the sales amount for only red products.
This new Red Sales
measure has been added to the table below to create a new column which shows the red sales for different brands.
ALL
Now, we shall explore the next table function in this blog post - ALL
. ALL
returns all the rows in a table, or all the values in a column, ignoring any filters that may have been applied.
In the table below, we have the colour of each product and we have the sales amount which has been calculated via the following measure:
Sales Amount = Sales[Quantity] * Sales[Net Price]
ALL
is useful if you want to compute percentages and ratios. If I want to see the percentage of red sales against all of the product sales I will need to compute the denominator of this ratio – the grand total of all the sales. We can do this using a new measure:
All Sales Amount = SUMX ( ALL ( Sales ), Sales[Quantity] * Sales[Net Price])
Here, SUMX
requires the result of ALL
Sales. ALL
ignores any filter that is applied in the report and returns all of the sales. SUMX
iterates over the whole table computing Quantity multiplied by Net Price, even if there are filters in place (such as the filter of 'Colour' in the example below). Whenever you use ALL
, any filter gets removed and you always compute the same number for all of the cells, as we can see in the table below.
Now we have the denominator All Sales Amount
, we can remove this measure from our table and create our percentage sales amount calculation:
Sales % = [Sales Amount] / [All Sales Amount]
The Sales %
measure can be added into the table as a new column which displays the percentage of sales of each colour over the grand total of sales.
Conclusion
In this blog post we have seen how the FILTER
table function can be used to filter a table and is useful when you want to return the result of a calculation over a subset of values. We have also seen how the ALL
table function can be used to return all rows of a table or values of a column, ignoring any filters applied and is useful when computing percentages and ratios.