Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Don't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.

Reply
manoj_0911
Post Patron
Post Patron

Incorrect Duration Calculation Due to GROUP and TEAM Associations in Power BI

Hello Power BI Experts,


SOME DAX I CREATED FOR FIRST REQUIREMENT

 

Available_Seconds =
DIVIDE(SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]), DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]), 0)
------------------------------------------------------------------------------------------------------------------------------------------
AVAILABLE DURATION IN DETAIL TABLE =

VAR RowLevel_Available =
DIVIDE(
SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]),
DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]),
0
)

VAR TotalLevel_Available =
SUMX(
SUMMARIZE(
AGENT_STATUS_SUBHOUR_V,
AGENT_STATUS_SUBHOUR_V[USER_ID], -- Calculate per agent
"AgentAvailable", SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]),
"AgentGroupCount", DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME])
),
DIVIDE([AgentAvailable], [AgentGroupCount], 0)
)

VAR FinalSeconds =
IF(
ISINSCOPE(AGENT_STATUS_SUBHOUR_V[USER_ID]),
RowLevel_Available, -- Use the row-level calculation when in scope
TotalLevel_Available -- Use the total calculation when out of scope
)

-- Convert Total Seconds to DD:HH:MM:SS Format
VAR Days = INT(FinalSeconds / 86400)
VAR Hours = INT(MOD(FinalSeconds, 86400) / 3600)
VAR Minutes = INT(MOD(FinalSeconds, 3600) / 60)
VAR Seconds = MOD(FinalSeconds, 60)

RETURN
IF(
ISBLANK(FinalSeconds),
BLANK(),
FORMAT(Days, "0") & ":" & FORMAT(Hours, "00") & ":" & FORMAT(Minutes, "00") & ":" & FORMAT(Seconds, "00")
)
-----------------------------------------------------------------------------------------------------------------------------
AVG AVAILABLE TIME IN CARDS =
VAR __total_seconds = SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]) // Sum of available seconds
VAR __distinct_groups = DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]) // Replace GROUP_COLUMN with the appropriate column name
VAR __average_seconds = DIVIDE(__total_seconds, __distinct_groups, 0) // Divide total seconds by distinct group count

// Convert the result (average seconds) into DD:HH:MM:SS format
VAR __days = INT(__average_seconds / 86400) // Calculate days
VAR __hours = INT(MOD(__average_seconds, 86400) / 3600) // Calculate remaining hours
VAR __minutes = INT(MOD(__average_seconds, 3600) / 60) // Calculate remaining minutes
VAR __seconds = MOD(__average_seconds, 60) // Calculate remaining seconds

// Format the result into DD:HH:MM:SS
VAR __result = FORMAT(__days, "0") & ":" & FORMAT(__hours, "00") & ":" & FORMAT(__minutes, "00") & ":" & FORMAT(__seconds, "00")

// Return the formatted result or BLANK if no data
RETURN
IF(ISBLANK(__average_seconds), BLANK(), __result)
--------------------------------------------------------------------------------------------------------------------------------

 

DB Admin Suggested:

Passing parameters from Power BI to a query directly instead of relying on DB views.
💡Issue: Power BI (or any BI tool) has limitations when handling parameters like a programming language (Java, .NET). Is my understanding correct?

 

My Manager Suggested:

Joining dimension tables 

 

This is a production issue, and I need to resolve it ASAP. Your help would be greatly appreciated! 🙏

3 REPLIES 3
shafiz_p
Super User
Super User

Hi @manoj_0911 

It is better to state your problem in clear and concise manner, this way it would be helpful to understand easily. What is the problem and what would be your desired output , if prossible , showing dummy output.

 

However, what I understood that, you want to evaluate duration, but want to consider the impact of both team and group while consider removing duplicates. You could try and update your code with below and check result that it evaluates correctly.

 

 

Available_Seconds = 

DIVIDE(
    SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]),
    DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]) * DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[TEAM]),
    0
)

 

 

 

AVAILABLE DURATION IN DETAIL TABLE = 
VAR RowLevel_Available =
    DIVIDE(
        SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]),
        DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]) * DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[TEAM_NAME]),
        0
    )

VAR TotalLevel_Available =
    SUMX(
        SUMMARIZE(
            AGENT_STATUS_SUBHOUR_V,
            AGENT_STATUS_SUBHOUR_V[USER_ID], -- Calculate per agent
            "AgentAvailable", SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]),
            "AgentGroupCount", DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]),
            "AgentTeamCount", DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[TEAM_NAME])
        ),
        DIVIDE([AgentAvailable], [AgentGroupCount] * [AgentTeamCount], 0)
    )

VAR FinalSeconds =
    IF(
        ISINSCOPE(AGENT_STATUS_SUBHOUR_V[USER_ID]),
        RowLevel_Available, -- Use the row-level calculation when in scope
        TotalLevel_Available -- Use the total calculation when out of scope
    )

-- Convert Total Seconds to DD:HH:MM:SS Format
VAR Days = INT(FinalSeconds / 86400)
VAR Hours = INT(MOD(FinalSeconds, 86400) / 3600)
VAR Minutes = INT(MOD(FinalSeconds, 3600) / 60)
VAR Seconds = MOD(FinalSeconds, 60)

RETURN
    IF(
        ISBLANK(FinalSeconds),
        BLANK(),
        FORMAT(Days, "0") & ":" & FORMAT(Hours, "00") & ":" & FORMAT(Minutes, "00") & ":" & FORMAT(Seconds, "00")
    )
AVG AVAILABLE TIME IN CARDS = 
VAR __total_seconds = SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]) // Sum of available seconds
VAR __distinct_groups = DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]) // Distinct group count
VAR __distinct_teams = DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[TEAM_NAME]) // Distinct team count
VAR __average_seconds = DIVIDE(__total_seconds, __distinct_groups * __distinct_teams, 0) // Divide total seconds by distinct group and team count

// Convert the result (average seconds) into DD:HH:MM:SS format
VAR __days = INT(__average_seconds / 86400) // Calculate days
VAR __hours = INT(MOD(__average_seconds, 86400) / 3600) // Calculate remaining hours
VAR __minutes = INT(MOD(__average_seconds, 3600) / 60) // Calculate remaining minutes
VAR __seconds = MOD(__average_seconds, 60) // Calculate remaining seconds

// Format the result into DD:HH:MM:SS
VAR __result = FORMAT(__days, "0") & ":" & FORMAT(__hours, "00") & ":" & FORMAT(__minutes, "00") & ":" & FORMAT(__seconds, "00")

// Return the formatted result or BLANK if no data
RETURN
    IF(ISBLANK(__average_seconds), BLANK(), __result)

 

 

 

By multiplying DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]) * DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[TEAM]), you are accounting for the combined distinct associations of a user with both groups and teams. This ensures that the total duration is divided by the correct number of distinct combinations of groups and teams, preventing overcounting.

 

 

Hope this helps!

If this solved your problem, please accept it as a solution and a kudos!!

 

Best Regards,
Shahariar Hafiz

Thank you so much for your reply, I used your logic and showed to my db admin he replied like "

 


Available_Seconds = DIVIDE( SUM(AGENT_STATUS_SUBHOUR_V[AVAILABLE]), DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[GROUP_NAME]) * DISTINCTCOUNT(AGENT_STATUS_SUBHOUR_V[TEAM]), 0 )

This may work. But what will happen if we add any kind if this metric in near future... like division.

 

The permanent solutions is having standalone filters. Meaning, Filters should be populated from  static table and the selected values should be passed to the result set for further filtration.

Hi @manoj_0911 ,

Did the above suggestions help with your scenario? if that is the case, you can consider Kudo or Accept the helpful suggestions to help others who faced similar requirements.

If these also don't help, please share more detailed information and description to help us clarify your scenario to test.

How to Get Your Question Answered Quickly 

Regards,

Xiaoxin Sheng

Community Support Team _ Xiaoxin
If this post helps, please consider accept as solution to help other members find it more quickly.

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Prices go up Feb. 11th.

Jan25PBI_Carousel

Power BI Monthly Update - January 2025

Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.

Jan NL Carousel

Fabric Community Update - January 2025

Find out what's new and trending in the Fabric community.