Forum Discussion

vickyd's avatar
vickyd
Helper V
8 years ago
Solved

DAX : Convert Weekly data to daily data

I have what I believe is a fairly common scenario related to timesheets that I've been breaking my head on.   Scenario: Each employee is available for X numbers of hours on a weekly basis. Typicall...
  • Anonymous's avatar
    Anonymous
    8 years ago

    HI vickyd,

     

    You can refer to below sample to generate the analysis daily work hour table.

     

    1. Merge targe tables.

    Merged = UNION(Table1,Table2) 

     

    2. Generate the calendar table with id and target.

    Result =
    VAR startDate =
        MINX ( Merged, [End Date] )
            + ( 1 - WEEKDAY ( MINX ( Merged, [End Date] ), 1 ) )
    VAR endDate =
        MAXX ( Merged, [End Date] )
    RETURN
        ADDCOLUMNS (
            CROSSJOIN (
                CALENDAR ( startDate, endDate ),
                DISTINCT ( SELECTCOLUMNS ( Merged, "ID", [ID] ) )
            ),
            "Target", LOOKUPVALUE (
                Merged[Work Hour],
                Merged[ID], [ID],
                Merged[End Date], [Date]
                    + ( 7 - WEEKDAY ( [Date], 1 ) )
            )
                + 0,
            "Day of Week", FORMAT ( [Date], "ddd" ),
            "Month", FORMAT ( [Date], "mmm" ),
            "Work Hour", IF ( WEEKDAY ( [Date], 1 ) <> 1 && WEEKDAY ( [Date], 1 ) <> 7, 8, 0 )
        )
    

     

    3. Add calculated column to calculate the available work hour.

    Available Hours =
    VAR isWorkDay =
        IF (
            WEEKDAY ( [Date], 1 ) <> 1
                && WEEKDAY ( [Date], 1 ) <> 7,
            TRUE (),
            FALSE ()
        )
    VAR rolling =
        SUMX (
            FILTER (
                ALL ( Result ),
                [ID] = EARLIER ( [ID] )
                    && WEEKNUM ( [Date], 1 ) = WEEKNUM ( EARLIER ( Result[Date] ), 1 )
                    && [Date] < EARLIER ( [Date] )
            ),
            [Work Hour]
        )
    RETURN
        IF (
            [Target] = 0,
            0,
            IF (
                rolling < [Target]
                    && rolling + 8
                    > [Target],
                [Target] - rolling,
                IF ( rolling < [Target] && isWorkDay, 8 )
                    + 0
            )
        )
    

     

    Regards,

    Xiaoxin Sheng