T-SQL concaténer plusieurs loggings en un seul logging

Je veux consolider les loggings du tableau suivant dans un seul logging par PolNo, Année, Plate-forme, Numéro.

| PolNo | YEAR | Platform | Number | Record | memo | |-------|------|----------|--------|--------|---------------------| | 123 | 2010 | pc | 1 | 1 | The user had issues | | 123 | 2010 | pc | 1 | 2 | with the os. | | 123 | 2009 | pc | 2 | 1 | Replaced RAM | | 123 | 2010 | mac | 1 | 1 | Ordered new CDs | | 564 | 2009 | mac | 1 | 1 | Broken CD TRAY | | 564 | 2010 | mac | 1 | 1 | USB port dead | | 564 | 2010 | pc | 1 | 1 | Ordered replacement | | 564 | 2010 | pc | 1 | 2 | laptop | 

Les loggings seront regroupés dans un seul logging (la colonne d'logging ne sera pas rescope). En même time, le PolNo, l'année, la plate-forme et le numéro sont concaténés dans un ID plutôt que des colonnes individuelles.

 | ID | YEAR | Platform | memo | |-----|------|----------|----------------------------------| | 123 | 2010 | pc-1 | The user had issues with the os. | | 123 | 2009 | pc-2 | Replaced RAM | | 123 | 2010 | mac-1 | Ordered new CDs | | 564 | 2009 | mac-1 | Broken CD TRAY | | 564 | 2010 | mac-1 | USB port dead | | 564 | 2010 | pc-1 | Ordered replacement laptop | 

Comme vous pouvez le voir, j'ai joint les loggings de la ligne 1 et de la ligne 6 ci-dessus dans un seul champ mémo continu. J'ai cependant quelques champs memo qui ont 21 ou 22 loggings à combiner / joindre.

Je ne sais pas comment je vais y arriver.

Curseur pensant, mais je n'ai pas beaucoup d'expérience et j'entends dire que ce n'est pas efficace. La table a environ 64k lignes à manipuler (dont 22k ont ​​plus d'un logging)

Vous pouvez utiliser l'ancienne astuce 'FOR XML' pour agréger le text de l'logging:

 CREATE TABLE #Records ( PolNo SMALLINT , Year SMALLINT , Platform NVARCHAR(16) , Number TINYINT , Record TINYINT , Memo NVARCHAR(256) ); INSERT INTO #Records(PolNo, Year, Platform, Number, Record, Memo) VALUES (123, 2010, 'pc', 1, 1, 'The user had issues') ,(123, 2010, 'pc', 1, 2, 'with the os.') ,(123, 2009, 'pc', 2, 1, 'Replaced RAM') ,(123, 2010, 'mac', 1, 1, 'Ordered new CDs') ,(564, 2009, 'mac', 1, 1, 'Broken CD TRAY') ,(564, 2010, 'mac', 1, 1, 'USB port dead') ,(564, 2010, 'pc', 1, 1, 'Ordered replacement') ,(564, 2010, 'pc', 1, 2, 'laptop') SELECT * FROM #Records; WITH RecordIdentifier AS ( SELECT PolNo, Year, Platform, Number FROM #Records GROUP BY PolNo, Year, Platform, Number ) SELECT CONCAT(PolNo, '-', Year, '-', Platform, '-', Number) AS Id , (SELECT ' ' + Memo FROM #Records forAggregation WHERE forAggregation.PolNo = record.PolNo AND forAggregation.Year = record.Year AND forAggregation.Platform = record.Platform AND forAggregation.Number = record.Number ORDER BY forAggregation.Record FOR XML PATH ('') ) AS Memo FROM RecordIdentifier record ORDER BY Id DROP TABLE #Records