Forum Discussion

Stealth02's avatar
Stealth02
Icon for Helper I rankHelper I
3 years ago
Solved

Lastnonblank at row context

Hi,

I’m trying to do the following through dax… For each group (i.e. item): if blank, use the lastnonblank value, else use the current value, and then perform a calculation.

(Note: I used dax max - instead of the time intelligence function based on this blog:Optimizing LASTNONBLANK and LASTNONBLANKVALUE calculations - SQLBI).

 

When items all have the same date as lastnonblank – my measure works properly (see example 1). However, when items have different lastnonblank dates (example 2), my subtotal measure only picks up the lastnonblank of the entire table date context instead of the doing the measure on each individual groups (i.e. items). I suspect I have to either create virtual tables or use the iterator functions (likely on my item_value measure) but I can’t seem to get it to work the way it should. I’m looking for help in doing this in DAX (PowerPivot Excel).

Below you will find examples of the issue and all the elements of my data model (fact and dimension tables, picture of data model and measures) that can be cut and pasted.

 

Example 1:

SOURCE DATA :

Items

ItemSort

2022-01-01

2022-01-02

2022-01-03

2022-01-04

Item1

1

10

nullnullnull

Item2

2

1

nullnullnull

Subtotal - Items

3

nullnullnullnull

 

It displays correctly in a pivot table:

 

 

 

Example 2

Items

ItemSort

2022-01-01

2022-01-02

2022-01-03

2022-01-04

Item1

1

10

nullnullnull

Item2

2

1

3

nullnull

Subtotal - Items

3

nullnullnullnull

 

It does not sum up properly in the pivot table – i.e. it is picking up the last nonblank value of the table (3) for the subtotal (subtotal s/b 13 for columns 2-4), however it is showing the right item values in columns:

 

 

 

Here are the elements of the data model:

Fact:

Items

Date

Value

Item1

2022-01-01

10

Item2

2022-01-01

1

Item2

2022-01-02

3

 

Dimension

Items

ItemSort

Item1

1

Item2

2

Subtotal - Items

3

 

Dates

Date

2022-01-01

2022-01-02

2022-01-03

2022-01-04

 

And a picture of the data model

 

 

 

And here are my three measures –

Measure 1: Item_Value

=IF (

ISEMPTY ( 'Fact' ),

VAR FirstVisibleDate =

MIN ( Dates[Date] )

VAR PreviousDate =

CALCULATE ( MAX ( 'Fact'[Date] ), Dates[Date] < FirstVisibleDate )

VAR PreviousValue =

CALCULATE ( SUM ( 'Fact'[Value] ), Dates[Date] = PreviousDate )

RETURN

PreviousValue,

SUM ( 'Fact'[Value] ) /*Current Value*/

)

 

Measure 2: Item_Subtotal

=IF (

MAX ( 'Dimension'[ItemSort] ) = 3,

CALCULATE (

[Item_Value],

FILTER (

ALL ( 'Dimension' ),

'Dimension'[ItemSort] < MAX ( 'Dimension'[ItemSort] )

)

)

)

 

Measure 3: ItemValue_wSubtotal

=SWITCH (

TRUE (),

MAX ( 'Dimension'[ItemSort] ) = 3, [Item_Subtotal],

[Item_Value]

)

 

  • tamerj1's avatar
    tamerj1
    3 years ago

    Hi Stealth02 
    It is more clear now but yet some pieces are still missing. I it possible to post a screenshot of your data model (relationship model) in order to complete the picture? However, let me give it a try and ask you to try the following modifications to your measures.

     

    Item_Value =
    SUMX (
        VALUES ( Dimension[Items] ),
        CALCULATE (
            IF (
                ISEMPTY ( 'Fact' ),
                VAR FirstVisibleDate =
                    MIN ( Dates[Date] )
                VAR PreviousDate =
                    CALCULATE ( MAX ( 'Fact'[Date] ), Dates[Date] < FirstVisibleDate )
                VAR PreviousValue =
                    CALCULATE ( SUM ( 'Fact'[Value] ), Dates[Date] = PreviousDate )
                RETURN
                    PreviousValue,
                SUM ( 'Fact'[Value] ) /*Current Value*/
            )
        )
    )
    Item_Subtotal =
    CALCULATE ( [Item_Value], ALL ( Dimension[Items] ) )
    ItemValue_wSubtotal1 =
    SWITCH (
        TRUE (),
        MAX ( 'Dimension'[ItemSort] ) = 3, [Item_Subtotal],
        [Item_Value]
    )

     

    Now you follow the same for the other fact table. Let's assume [ItemValue_wSubtotal1] belongs to 'Budget' and [ItemValue_wSubtotal2] belongs to 'Expenditures' then your final measure that you will add to the matrix would simply be

    Current Yr Surplus = [ItemValue_wSubtotal1] - [ItemValue_wSubtotal2]

     

     

  • Just for reference - Here is the complete model and measures based on tamerj1 response above (Raw Tables, Tables loaded to DataModel, DataModel diagram and Measures):

     

    Raw tables transformed through PQ:

    RawBudgetTable

    ItemsItemSort2022-01-012022-01-022022-01-03
    Budget - Item111  
    Budget - Item2222 
    Budget - Item 33345

     

    Raw Expenditure Table

    ItemsItemSort2022-01-012022-01-022022-01-03
    Expenditures181012

     

    Transformed Tables - Added to the data model:

    Fact Tables:

    FactBudget:

    ItemsDateValue
    Budget - Item12022-01-011
    Budget - Item22022-01-012
    Budget - Item22022-01-022
    Budget - Item 32022-01-013
    Budget - Item 32022-01-024
    Budget - Item 32022-01-035

     

    FactExpenditures:

    ItemsDateValue
    Expenditures2022-01-018
    Expenditures2022-01-0210
    Expenditures2022-01-0312

     

    Dimension Tables:

    Dates:

    Date
    2022-01-01
    2022-01-02
    2022-01-03
    2022-01-03

     

    DimValueType

    ItemsItemSort
    Budget - Item11
    Budget - Item22
    Budget - Item 33
    Expenditures1

     

    dimFinMatrix

    Financial MatrixItemSort
    Budget - Item11
    Budget - Item22
    Budget - Item 33
    Total Budget4
    Expenditures5
    Total Expenditures6
    Surplus/Shortfall - Current Period7

     

    Diagram of DataModel:

     

    Measures:

     

    ItemValueBudget=
    SUMX (
        VALUES ( DimValueType[Items] ),
        CALCULATE (
            IF (
                ISEMPTY ( 'FactBudget' ),
                VAR FirstVisibleDate =
                    MIN ( Dates[Date] )
                VAR PreviousDate =
                    CALCULATE ( MAX ( 'FactBudget'[Date] ), Dates[Date] < FirstVisibleDate )
                VAR PreviousValue =
                    CALCULATE ( SUM ( 'FactBudget'[Value] ), Dates[Date] = PreviousDate )
                RETURN
                    PreviousValue,
                SUM ( 'FactBudget'[Value] ) /*Current Value*/
            )
        )
    )
    ItemValueExpenditures=
    SUM(FactExpenditures[Value])
    ItemTotalBudget=
    CALCULATE([ItemValueBudget],all(dimValueType))
    ItemTotal_Expenditures=
    CALCULATE([ItemValueExpenditures],all(dimValueType))
    SuplusShortfall_Current=
    [ItemTotalBudget]-[ItemTotal_Expenditures]
    ItemwValue=
    VAR MaxItem =
        MAX ( dimFinMatrix[ItemSort] )
    VAR Results =
        SWITCH (
            TRUE (),
            MaxItem < 4, [ItemValueBudget],
            MaxItem = 4, [ItemTotalBudget],
            MaxItem = 6, [ItemTotal_Expenditures],
            MaxItem = 7, [SurplusShortfall_Current],
            [ItemValueExpenditures]
        )
    RETURN
        Results

     

     

    And Results in Pivot Table: 

     

9 Replies

  • tamerj1's avatar
    tamerj1
    Icon for Community Champion rankCommunity Champion

    Hi Stealth02 

    why do you need Subtotal-Items while you have the grand total? Or do you actually have another hierarchy level?

    • Stealth02's avatar
      Stealth02
      Icon for Helper I rankHelper I

      This is a sample example, where for simplicity I kept it as a subtotal. But even without considering the subtotal row, the grand total has exactly the same issue as I am displaying in the subtotal item row. 

       

      FYI. For my actual case, I am doing financial statement like reporting, where I am using a approach similar to what is being described in these two videos:  Vancouver Power BI & Modern Excel Usergroup Meeting - Power BI Track Apr 2021 - YouTube and How to Build a Financial Report in Power BI - Bing video but with the added complexity that I have budgets that are only there for some periods - but I want to show these for all periods and use in calculations. Right now I have completed the work around using power query - but I would like that in DAX instead as it will make my modeling more efficient.  

      • tamerj1's avatar
        tamerj1
        Icon for Community Champion rankCommunity Champion

        Stealth02 

        Not sure how your actual Dimension table looks like but even idlf it contains more than one level, the subtotal item shall not be required. You just need to iterate over the Dimension table to force aditivity such as

        Measure 4 = SUMX ( Dimention, [Item_Value] )

        and total value shall appear at the grand total cell.