Rompre datatables enfant dans plusieurs loggings en fonction de l'ID parent

J'ai une exigence où je dois casser des données d'enfant dans plusieurs loggings. Ci-dessous, im essayant de te faire comprendre avec une certaine date d'échantillon car je ne devrais pas postr des données originales. Dans datatables ci-dessous pour chaque ParentId nous pouvons avoir plusieurs loggings enfants. Donc, maintenant nous devons afficher chaque logging avec 3 données enfants dans des colonnes séparées avec leur identifiant parent correspondant comme indiqué dans la sortie attendue ci-dessous. Nous avons essayé avec des sliders même si nous avons eu mais il est en train de tuer le time d'exécution et nous avons aussi pensé à utiliser le pivot et semble devenir très complexe et je ne suis pas sûr que cela puisse fonctionner. Toute aide ou approche sera appréciée. Merci d'avance.

Table des parents

SELECT * into #Parent FROM ( SELECT 1 PARENTID,'A' PARENTNAME UNION ALL SELECT 2,'B' UNION ALL SELECT 3,'C' UNION ALL SELECT 4,'D' ) AS A 

Table des enfants

 SELECT * INTO #Child from ( SELECT 10 as CHILDID,1 as PARENTID ,'DEF' AS CHILDNAME union all SELECT 11 , 1,'EFG' UNION ALL SELECT 12,1,'GHI' UNION ALL SELECT 13,1,'JKL' UNION ALL SELECT 14,1,'MNO' UNION ALL SELECT 15,1,'PQR' UNION ALL SELECT 20,2,'ACE' UNION ALL SELECT 30,3,'STU' UNION ALL SELECT 31,3,'VWX' UNION ALL SELECT 32,3,'WXY' UNION ALL SELECT 33,3,'XYZ' )as a SELECT * FROM #Parent SELECT * FROM #CHILD 

Résultat attendu:

 PARENTID Child1Name Child2Name Child3Name 1 DEF EFG GHI 1 JKL MNO PQR 2 ACE NULL NULL 3 STU VWX WXY 3 XYZ NULL NULL 

Générer les deux row_numbers en utilisant la fonction row_number() pas besoin de slider

 SELECT p.PARENTID, coalesce(max(case when c.rn1=1 then c.ChildName end), max(case when c.rn1%3=1 then c.ChildName end)) [Child1Name], coalesce(max(case when c.rn1=2 then c.ChildName end), max(case when c.rn1%3=2 then c.ChildName end)) [Child2Name], coalesce(max(case when c.rn1=3 then c.ChildName end), max(case when c.rn1%3=0 then c.ChildName end)) [Child3Name] FROM Parent p join (SELECT *, (row_number() over (partition by PARENTID order by childid)-1)/3 rn, row_number() over (partition by PARENTID order by childid) rn1 FROM CHILD) c on c.PARENTID = p.PARENTID group by p.PARENTID, c.rn order by p.PARENTID 

Résultat :

 PARENTID Child1Name Child2Name Child3Name 1 DEF EFG GHI 1 JKL MNO PQR 2 ACE NULL NULL 3 STU VWX WXY 3 XYZ NULL NULL 

Utilisez NTILE & ROW_NUMBER pour les split en groupe de 3 loggings

 SELECT PARENTID,CHILD1, CHILD2,CHILD3 FROM ( SELECT 'CHILD'+CASE WHEN grp='0' THEN '3' ELSE grp END CHILDS ,CAST(NTILE(2) OVER(PARTITION BY PARENTID ORDER BY CHILDID) AS VARCHAR(10)) +'-' +CAST(PARENTID AS VARCHAR(10)) as PARENTID_2 , PARENTID, CHILDNAME FROM ( SELECT CAST(ROW_NUMBER() OVER (PARTITION BY PARENTID ORDER BY CHILDID)%3 AS VARCHAR(10)) AS grp ,* FROM #CHILD )A )B PIVOT ( MAX(CHILDNAME) FOR CHILDS IN([CHILD1],[CHILD2],[CHILD3]) )PV 

Résultat:

 +----------+--------+--------+--------+ | PARENTID | CHILD1 | CHILD2 | CHILD3 | +----------+--------+--------+--------+ | 1 | DEF | EFG | GHI | | 1 | JKL | MNO | PQR | | 2 | ACE | NULL | NULL | | 3 | STU | VWX | NULL | | 3 | XYZ | NULL | WXY | +----------+--------+--------+--------+ 

ROW_NUMBER majeure de la réponse originale , il vous suffit d'avoir un PIVOT , deux ROW_NUMBER , et c'est tout:

 SELECT PARENTID, [0], [1], [2] FROM ( SELECT PARENTID , CHILDNAME , ParentBreaker = (ROW_NUMBER() OVER(PARTITION BY PARENTID ORDER BY CHILDID) - 1) / 3 + 1 -- You want this to facilitate splitting every 3 child records. , Child#Name = (ROW_NUMBER() OVER(PARTITION BY PARENTID ORDER BY CHILDID) - 1) % 3 FROM #Child ) AS RowNumbered PIVOT ( MAX(CHILDNAME) FOR Child#Name IN ([0], [1], [2]) ) AS T ORDER BY PARENTID 

Avec un CONCAT rapide et un +1 sur Child#Name , vous pouvez probablement simuler les noms de colonnes dans votre " résultat attendu ".