top of page
Jihwan Kim

How I learned to use the DETAILROWS DAX Function in Power BI

In this writing, I like to share my journey of learning and adopting the DETAILROWS DAX function in Power BI.


What started as a curiosity about this often overlooked feature has evolved into a valuable tool in my data modeling toolkit, enabling me to gain deeper insights and deliver more effective reports.



Link to Microsoft Learn website: DETAILROWS function (DAX) - DAX | Microsoft Learn


What is the DETAILROWS DAX Function?


The DETAILROWS function in DAX is a feature designed to display the underlying data of an aggregated result in a tabular format. In essence, it helps drill down into the granular data behind summary figures. This function is particularly useful when dealing with tables in Power BI that summarize data using measures, but where there’s also a need to access the row-level details for further analysis. This means I can define a complex table expression once and reuse it by calling DETAILROWS. However, using it this way might lead to inefficient query plans, especially when working with time intelligence calculations. If the performance is acceptable in the data model, it can still be a useful option. To assign a Detail Rows Expression in Power BI, I need to use Tabular Editor, while DETAILROWS can be used directly in Power BI Desktop's DAX editor.



My Use Cases of DETAILROWS


I began to rethink my approach. Instead of focusing on summarizing the data to get aggregated results in the measure, I shifted to the idea of virtually creating a new table and using it across all my measures.


In the following sections, I will describe and compare how my DAX measures appeared before using the DETAILROWS DAX function and how they evolved after implementing it.


For this example, I use a DETAIL ROWS EXPRESSION, written in Tabular Editor 2, within the DETAILROWS DAX function.


The data model I’m working with is simple, displaying customer data with start and end date information.


I did not establish any relationship between the calendar table and the customer table.


I generated insights, such as the following, by calculating the customer count per month.



Customer count: = 
VAR _t =
    FILTER (
        customer,
        customer[start_date] <= MAX ( 'calendar'[Date] )
            && customer[end_date] >= MIN ( 'calendar'[Date] )
    )
RETURN
    COUNTROWS ( _t )



But what if I could virtually create a table (VAR _t in the above measure), and store it as DETAIL ROWS EXPRESSION and use it in the measure?


  1. In Tabular Editor 2, create a new measure.

  2. Change the property to [Detail Rows Expression].

  3. Write DAX formula that creates the table.

  4. Save it to the data model.


Write the measure like below, and it shows the same result.

This approach highlights the simplicity and versatility of using the DETAILROWS expression across different measures.


Customer count using detailrows: = 
VAR _t = DETAILROWS ( [CustomerTable] ) 
RETURN 
COUNTROWS ( _t )





I also explored a different approach to create a new virtual table that looks like this:


A new table, `new_customer_table`, containing two columns:

- One column, `customer_id`, which holds the IDs of the customers.

- The other column, `date`, which contains all the consecutive dates for each customer, starting from their `start_date` and ending on their `end_date`.


Let’s go ahead and create it virtually.

The first step is to create this table using the DAX Query View, as shown below. This approach successfully generates the table:


Now, I can use this virtual table to create a new measure like below.

Customer count v2: = 
VAR _t =
    SUMMARIZE (
        GENERATE (
            customer,
            FILTER (
                'calendar',
                'calendar'[Date] >= customer[start_date]
                    && 'calendar'[Date] <= customer[end_date]
            )
        ),
        customer[customer]
    )
RETURN
    COUNTROWS ( _t )

And, I can also try to create detail rows expression and use it in the new measure.

Customer count using detailrows v2: = 
VAR _t = DETAILROWS ( [Customer Table v2] ) 
RETURN 
COUNTROWS ( _t )




It is hard to say whether using the detail rows expression and the DETAILROWS DAX function improves performance based on this sample.

However, what I have learned is that the flexibility and control it offers can greatly enhance the way I handle detailed data within my reports. By creating virtual tables and customizing which details are shown when drilling into aggregated data, I can deliver more intuitive and insightful reports for users.


The ability to define which rows or columns are displayed when interacting with summarized data opens up new possibilities for creating dynamic and responsive reports. While performance gains might not be immediately evident in simple models, the true value of DETAILROWS lies in its ability to enhance the interactivity and depth of analysis in larger, more complex datasets.


I hope this helps having fun exploring the potential of the DETAILROWS DAX function.

327 views0 comments

Comments


bottom of page