Combining different teams sprints into one

I was wondering if there is an easier way to combine multiple teams sprints into one? For example, lets say there are 4 scrum teams in the project I am pulling in. Each team has a different name for their first sprint (team a sprint 1, team b sprint 1, team c sprint 1, and team d sprint 1). Currently, I am going into the Sprint dimension and creating a new calculated member labeled sprint 1 using this formula:
(Aggregate(
Filter(
[Sprint].[Sprint].Members,
([Sprint].CurrentMember.Name MATCHES ‘.sprint 1.
AND
NOT isEmpty([Sprint].CurrentMember.get(‘Start date’))
)
)

The problem is the maintenance. I have to create new custom sprint names constantly. An example of a measures that I am using is Say/Do ration (which is taking the completed committed issues /committed sprint issues). Is there any way to combine sprint names differently?

Hi,

Unfortunately, there is not any more universal way to aggregate dimension members using the patterns of names of dimension members. We have in our backlog a request about option to create custom hierarchies in any dimension but it seems that this feature request currently does not cover such a level of flexibility that is required by your use case.

Anyway, thank you for the idea. I linked your post to this feature request and it will be evaluated if there can be a solution also for your case.

Kindly,
Janis, eazyBI support

With version 6.1 we added a new to create custom hierarchies in some dimensions, including Sprints.

You would like to import custom properties for sprints to represent a potential grouping mechanism. For example, you can import a property cycle for Sprints with additional data import.

Then you can use this custom property Cycle to build a new custom hierarchy in Sprint dimension and group sprints by cycles dynamically.

Import additional property to Sprint based on Sprint naming pattern XX Sprint # and you would like to retrieve the Sprint # only from it.

REST API source definition
{
  "application_type": "rest_api",
  "application_params": {
    "source_params": {
      "url": "https://ecosystem.atlassian.net/rest/agile/1.0/board?type=scrum",
      "pagination": "offset_limit",
      "incremental": null,
      "incremental_stop_import": null,
      "authentication_type": "basic",
      "username": "specify username",
      "content_type": "json",
      "custom_javascript_code": "// retrieves all sprints within one board and will go from the last sprint and rank decreasingly closed sprints\nvar sprints = [{\n  sprint_id: null,\n  sprint_name: null \n}];\nvar allSprints = [];\nvar allSprintsLoaded = false;\nstartAt = 0;\nmaxResult = 50;\nif (doc.type == \"scrum\") {\n\n  do \n  {\n    result = getDocument( \"/rest/agile/1.0/board/\" + doc.id + \"/sprint?startAt=\" + startAt + \"&maxResults=\" + maxResult, {ignoreErrors: \"404\"});\n    if (result && result.values ) {\n      allSprints = allSprints.concat(result.values);\n      allSprintsLoaded = result.isLast;\n      startAt = startAt + maxResult;\n    }\n  }\n  while (!allSprintsLoaded); \n  \n  if (allSprints ) { \n  for(var i = 0; i < allSprints.length; i++) {\n    var sprint = allSprints[i];\n    if (sprint && sprint.originBoardId == doc.id ) {\n      sprints.push({\n        sprint_id: sprint.id,\n        sprint_name: sprint.name.match(/( Sprint )(\\d+)/) ? sprint.name.match(/( Sprint )(\\d+)/)[0] : doc.name\n      });\n   }\n  }\n} \n\n}\nreturn _.uniq(sprints);",
      "json_data_path": "$.values",
      "offset_parameter": "startAt",
      "limit_parameter": "maxResults",
      "limit_value": 50
    },
    "extra_options": {
      "regular_import_frequency": null,
      "regular_import_at": "",
      "time_zone": "Helsinki"
    }
  },
  "source_cube_name": "Issues",
  "columns": [
    {
      "name": "sprint_id",
      "data_type": "integer",
      "dimension": "Sprint",
      "dimension_level": "Sprint",
      "key_column": true,
      "skip_missing": true
    },
    {
      "name": "sprint_name",
      "data_type": "string",
      "dimension": "Sprint",
      "dimension_level": "Sprint",
      "property": "Cycle"
    }
  ]
}

In Source Data tab add new source application and in Import definition use the REST API source definition added above.

Update the Source data URL by a correct JIRA HOME URL/Jira site URL instead of https://ecosystem.atlassian.net:

Add the authentication to your Jira.
If you have a different Sprint naming pattern you would like to use, update the JavaScript code by edit custom javascript code.

The current JavaScript calculation should retrieve the Sprint # from sprints with a naming pattern XX Sprint #. The mapping is in place as well to import a property for a sprint dimension with a name Cycle. Run an import.

After import, you can add custom hierarchy in Sprint dimension based on the Property Cycle.

Then you can use this new Sprint cycle hierarchy in the report. You might want to reorder the members there, though. You can define a new custom report specific measure (as it is needed in a particular report only):
Sprint number:
Cast(Replace( ExtractString([Sprint].CurrentHierarchyMember.Name , 'Sprint (\d+).*'), "Sprint " , "") as Numeric)

Then you can use this measure to the report and apply the Ascending order to it.

Here are several reports in eazyBI Demo Training account created based on this custom hierarchy.:
Sprints by sprint name balance
Sprint by sprint name velocity
Sprints by name current cycle story points burn-down

Daina / support@eazybi.com

And here is a training video on additional data import and how to build a custom Sprint hierarchy from those data:
Screenshot 2021-05-10 at 17.06.36
Presentation slides: Power-up-reports-with-additional-data-import.pdf (5.9 MB)