2016-10-05 1 views
1

Cette question a peut-être été posée auparavant, mais j'ai creusé et je ne trouve rien de tel. Merci d'avanceBesoin d'aide pour regrouper plusieurs lignes dans une seule chaîne en fonction de GROUP BY?

EDIT: Totalement oublié. Nous utilisons SQL 2005 (sinon je serais probablement juste utiliser GROUP_CONCAT)

Tableau Exemple:

ID CATEGORY ATTRIBUTE 
1 A Piano 
1 A Saxophone 
1 B Jazz 
1 C Mellow 
1 C Pensive 
2 A Drums 
2 A Guitar 
2 B Rock 
2 B Classics 
2 C Upbeat 
2 C High Energy 

souhaité Sortie:

ID CATEGORY ATTRIBUTE 
1 A Piano, Saxophone 
1 B Jazz 
1 C Mellow, Pensive 
2 A Drums, Guitar 
2 B Rock, Classics 
2 C Upbeat, High Energy 
+0

Essayez le terme de recherche 'pivot' – Twelfth

+0

Pouvez-vous montrer le code que vous avez essayé? – mfredy

+0

Google: " concaténation de chaînes agrégées". –

Répondre

0

Juste une requête standard de style ancien imbriquée à l'aide XML PATH devrait fonctionner parfaitement pour SQL 2005.

DECLARE @TableName TABLE 
(
    ID   INT 
    ,CATEGORY NVARCHAR(5) 
    ,ATTRIBUTE NVARCHAR(50) 
    ,PRIMARY KEY(ID, CATEGORY, ATTRIBUTE) 
) 

INSERT INTO @TableName 
(
    ID   
    ,CATEGORY 
    ,ATTRIBUTE 
) 
VALUES 
    (1 ,'A' ,'Piano'   ), 
    (1 ,'A' ,'Saxophone'  ), 
    (1 ,'B' ,'Jazz'   ), 
    (1 ,'C' ,'Mellow'   ), 
    (1 ,'C' ,'Pensive'   ), 
    (2 ,'A' ,'Drums'   ), 
    (2 ,'A' ,'Guitar'   ), 
    (2 ,'B' ,'Rock'   ), 
    (2 ,'B' ,'Classics'  ), 
    (2 ,'C' ,'Upbeat'   ), 
    (2 ,'C' ,'High Energy'  ); 


WITH CTE_Concatenate 
AS 
(
    SELECT ID 
      ,CATEGORY 
      ,(
       SELECT ATTRIBUTE + ',' 
       FROM @TableName [Inner] 
       WHERE [Outer].ID = [Inner].ID AND [Outer].CATEGORY = [Inner].CATEGORY 
       FOR XML PATH('') 
      ) AS ATTRIBUTES 
    FROM @TableName [Outer] 
    GROUP BY ID, CATEGORY 
) 
SELECT ID 
     ,CATEGORY 
     ,LEFT(ATTRIBUTES, LEN(ATTRIBUTES) - 1) AS ATTRIBUTES 
FROM CTE_Concatenate; 

La requête peut être simplifiée utilisant la fonction STUFF comme suivre :

SELECT ID 
     ,CATEGORY 
     ,STUFF((
      SELECT ',' + ATTRIBUTE 
      FROM @TableName [Inner] 
      WHERE [Outer].ID = [Inner].ID AND [Outer].CATEGORY = [Inner].CATEGORY 
      FOR XML PATH('')), 1, 1, '') AS ATTRIBUTES 
FROM @TableName [Outer] 
GROUP BY ID, CATEGORY; 
+0

Merci! Cela a fonctionné parfaitement. Malheureusement, j'ai reçu une mise à jour qui demandera plus de travail mais je posterai une autre question à ce sujet. –

1

Utilisez GROUP_CONCAT()

SELECT ID,CATEGORY,GROUP_CONCAT(ATTRIBUTE) 
FROM TABLENAME 
GROUP BY ID,CATEGORY 
+1

+1 pour MySQL ou SQLite, mais d'autres marques de SGBDR utilisent d'autres syntaxes. OP n'était pas spécifique quant à la marque qu'il utilise. –

+0

Vous avez raison ma mauvaise. Juste édité le message original, nous utilisons SQL 2005 –

0

POUR MS SQL Utilisez cette syntaxe

SELECT table_name, LEFT(column_names , LEN(column_names)-1) AS column_names 
FROM information_schema.columns AS extern 
CROSS APPLY 
(
    SELECT column_name + ',' 
    FROM information_schema.columns AS intern 
    WHERE extern.table_name = intern.table_name 
    FOR XML PATH('') 
) pre_trimmed (column_names) 
GROUP BY table_name, column_names; 
1

ESSAYEZ CE UN

SELECT ID, 
     CATEGORY, 
     ATTRIBUTE1 
FROM TABLENAME TB 
cross apply 
    (SELECT TB1.ATTRIBUTE + ', ' 
    FROM TABLENAME TB1 
    WHERE TB1.ID = TB.ID For XML PATH(''))A1 (ATTRIBUTE1) 
GROUP BY TB.ID,TB.CATEGORY 
+0

N'a pas tout à fait le faire. Les attributs sont maintenant simplement répétés dans la colonne Attribute1 mais séparés par des virgules. i.e "Rock, Rock, Rock, Rock, Rock, Rock, Rock, Rock" –

+0

réessayer J'espère que cela devrait fonctionner –

+0

Avez-vous modifié la requête d'origine? Ils semblent les mêmes –