Hello -
I’m looking to create a report which displays as a stacked bar chart, with the sprint churn as the main metric. All my teams have standardized sprint names and my current approach is to create a sprint calculated measure to aggregate all the sprint names. Like this
Aggregate(
Filter(
[Sprint].[Sprint].Members,
Right(Trim([Sprint].CurrentMember.Name), 11) = "2025.PI1.S1"
)
)
This works great, but it’s not scalable, and it’s also very messy having all these calculated members flooding my sprint dimension. Is there a different approach I can take which would yield the same results without all the manual effort? This is the visual I’m looking for, with each “stack” being a sprint (Sprint 1, sprint2, sprint 3….) and the colors on the stack representing different teams.
Hi @janedoe2
Thanks for posting your question!
You may want to consider looking into our documentation page here - Sprint reports for sprint week cycles (Sprint custom hierarchies) that shows how you could create custom Sprint Hierarchies, including a sub-section for sprint naming patterns
Take a look at it and see if this fits your use case. If you have any questions, let me know!
Best wishes,
Elita from support@eazybi.com
Thanks @Elita.Kalane
I see that in this result set, JIRA is exporting by week starting on Monday. If we stop/start our sprints mid-week, will our sprints align to the ‘sprint weeks’ as JIRA defines them here?
Hi @janedoe2
Thanks for following up! I can see there might be a bit of confusion about the documentation example. The week cycle approach shown in the documentation is just one example of how to create custom Sprint hierarchies.
Try updating the Custom JS code
With the code below and see if you are able to extract the naming. The JavaScript code I provided extracts the sprint pattern directly from the sprint name (the last 11 characters) and doesn’t use dates or week alignment at all.
var sprints = [{
board_id: null,
sprint_id: null,
sprint_pattern: null
}];
var allSprints = [];
var allSprintsLoaded = false;
startAt = 0;
maxResult = 50;
if (doc.type == "scrum") {
do {
result = getDocument("/rest/agile/1.0/board/" + doc.id + "/sprint?startAt=" + startAt + "&maxResults=" + maxResult, {ignoreErrors: "404"});
if (result && result.values) {
allSprints = allSprints.concat(result.values);
allSprintsLoaded = result.isLast;
startAt = startAt + maxResult;
}
} while (!allSprintsLoaded);
if (allSprints) {
for(var i = 0; i < allSprints.length; i++) {
var sprint = allSprints[i];
if (sprint && sprint.originBoardId == doc.id) {
var sprint_pattern = null;
if (sprint.name && sprint.name.length >= 11) {
// Extract the last 11 characters from sprint name
sprint_pattern = sprint.name.substring(sprint.name.length - 11);
}
sprints.push({
board_id: doc.id,
sprint_id: sprint.id,
sprint_pattern: sprint_pattern
});
}
}
}
}
return _.uniq(sprints);
Best wishes,
Elita from support@eazybi.com