diff --git a/api/src/engine/connectors/datashield/transformations.ts b/api/src/engine/connectors/datashield/transformations.ts
index 7e2c21505293c7bc7407be7c42035714425d48ca..db452ef8376aaf454d4eca8c14646848d2bd1c42 100644
--- a/api/src/engine/connectors/datashield/transformations.ts
+++ b/api/src/engine/connectors/datashield/transformations.ts
@@ -10,24 +10,23 @@ export const transformToDomain = jsonata(`
   "id": "sophia",
   "label": "Sophia",
   "datasets": datasets.{
-      "id": $.id[0],
-      "label": $.label[0]
+    "id": $.id[0],
+    "label": $.label[0]
   },
   "rootGroup": {
-      "id": "root",
-      "label": "Sophia",
-      "groups": $append(rootGroup.groups, $keys($.groups.variables))
+    "id": "root",
+    "label": "Sophia",
+    "groups": $append(rootGroup.groups, $keys($.groups.variables))
   },
   "groups": datasets.{
-      "id": $.id[0],
-      "label": $.label[0],
-      "groups": [],
-      "datasets": $.id[0][]
-    }[],
-  "variables": $distinct(groups.variables.($type($) = 'object' ? $.* : $)).{
-      "id": $,
-      "label": $trim($replace($ & '', '.', ' '))
-  }
+    "id": $.id[0],
+    "label": $.label[0],
+    "groups": [],
+    "datasets": $.id[0][]
+  }[],
+  "variables": variables.(
+    $merge([$, {'label': $.label ? $label : $trim($replace($.id, '.', ' '))}])
+  )
 }
 `);
 
@@ -86,39 +85,50 @@ $ ~> |$|{'id': subjectId}, ['subjectId']|
 `);
 
 export type dsGroup = {
-  id: string[];
-  label: string[];
+  id: string;
+  label: string;
   variables: Record<string, string[]> | string[];
   groups?: string[];
 };
 
 export const dataToGroups = (dsDomain: Domain, groups: dsGroup[]) => {
-  groups.forEach((g) => {
-    if (Array.isArray(g.variables)) {
-      dsDomain.groups.push({
-        id: g.id[0],
-        label: g.label[0],
-        variables: g.variables,
-      });
-      return;
+  groups.forEach((group) => {
+    // Check if variables contains sub db split
+    if (Array.isArray(group.variables)) {
+      // Global group (exist in every cohort)
+      group.variables = dsDomain.datasets.reduce((prev, db) => {
+        prev[db.id] = group.variables;
+        return prev;
+      }, {});
     }
 
-    if (dsDomain.rootGroup.groups.includes(g.id[0])) {
+    let isRootGroup = false;
+
+    // remove group if it's in the root
+    if (dsDomain.rootGroup.groups.includes(group.id)) {
+      isRootGroup = true;
       dsDomain.rootGroup.groups = dsDomain.rootGroup.groups.filter(
-        (gId) => gId !== g.id[0],
+        (gId) => gId !== group.id,
       );
     }
 
-    return Object.entries(g.variables).map(([key, val]) => {
-      const id = `${g.id}-${key}`;
-      dsDomain.groups.find((g) => g.id === key).groups.push(id);
-      const group: Group = {
+    return Object.entries(group.variables).map(([db, variables]) => {
+      const id = `${group.id}-${db}`;
+
+      // push group into root db group
+      if (isRootGroup)
+        dsDomain.groups.find((g2) => g2.id === db).groups.push(id);
+
+      const newGroup: Group = {
         id,
-        variables: val,
-        groups: g['groups'] ? g['groups'].map((g) => `${g}-${key}`) : undefined,
-        label: `${g.label[0]} (${key})`,
+        variables,
+        groups: group['groups']
+          ? group['groups'].map((g2) => `${g2}-${db}`)
+          : undefined,
+        label: `${group.label} (${db})`,
       };
-      dsDomain.groups.push(group);
+
+      dsDomain.groups.push(newGroup);
     });
   });
 };