web-dev-qa-db-fra.com

GROUP BY pour combiner / concaténer une colonne

J'ai une table comme suit:

ID  User  Activity  PageURL  
 1  Me    act1      ab     
 2  Me    act1      cd     
 3  You   act2      xy     
 4  You   act2      st

Je souhaite regrouper par utilisateur et par activité de manière à obtenir quelque chose comme:

User  Activity  PageURL  
Me    act1      ab, cd     
You   act2      xy, st

Comme vous pouvez le constater, la colonne PageURL est combinée, séparée par une virgule basée sur le groupe par.

J'apprécierais vraiment tous les pointeurs et conseils.

90
viv_acious
SELECT
     [User], Activity,
     STUFF(
         (SELECT DISTINCT ',' + PageURL
          FROM TableName
          WHERE [User] = a.[User] AND Activity = a.Activity
          FOR XML PATH (''))
          , 1, 1, '')  AS URLList
FROM TableName AS a
GROUP BY [User], Activity
159
John Woo

Une bonne question Devrait vous dire qu'il a fallu un certain temps pour résoudre ce problème. Voici mon résultat.

DECLARE @TABLE TABLE
(  
ID INT,  
USERS VARCHAR(10),  
ACTIVITY VARCHAR(10),  
PAGEURL VARCHAR(10)  
)

INSERT INTO @TABLE  
VALUES  (1, 'Me', 'act1', 'ab'),
        (2, 'Me', 'act1', 'cd'),
        (3, 'You', 'act2', 'xy'),
        (4, 'You', 'act2', 'st')


SELECT T1.USERS, T1.ACTIVITY,   
        STUFF(  
        (  
        SELECT ',' + T2.PAGEURL  
        FROM @TABLE T2  
        WHERE T1.USERS = T2.USERS  
        FOR XML PATH ('')  
        ),1,1,'')  
FROM @TABLE T1  
GROUP BY T1.USERS, T1.ACTIVITY
7
Praveen Nambiar