GROUP BY组合/连接一列

viv*_*ous 93 sql sql-server group-by sql-server-2008

我有一张桌子如下:

ID  User  Activity  PageURL  
 1  Me    act1      ab     
 2  Me    act1      cd     
 3  You   act2      xy     
 4  You   act2      st
Run Code Online (Sandbox Code Playgroud)

我希望按用户和活动进行分组,这样我最终得到的结果如下:

User  Activity  PageURL  
Me    act1      ab, cd     
You   act2      xy, st
Run Code Online (Sandbox Code Playgroud)

如您所见,列PageURL由基于group by的逗号分隔在一起.

真的很感激任何指针和建议.

Joh*_*Woo 164

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
Run Code Online (Sandbox Code Playgroud)

  • 太好了!详细说明:您使用`STUFF()`删除连接的PageUrl字符串的第一个逗号.PageUrl字符串本身是通过使用带有空路径的"FOR XML PATH()"创建的,以连接检索到的PageUrls.非常聪明:)一些消息来源:`STUFF():`http://msdn.microsoft.com/en-us/library/ms188043.aspx`for XML:`https://www.simple-talk.com/sql /学习-SQL服务器/使用,该换的XML子句对返回查询结果-AS-XML / (18认同)
  • 这是对用户问题的有效回答.但是,如果您要解释查询中发生的情况以及为什么它可以正常工作,那将是一个更好的答案. (9认同)
  • 为什么这个查询对我来说永远存在?计时. (2认同)

Pra*_*iar 8

一个好问题.应该告诉你,花了一些时间来破解这个.这是我的结果.

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
Run Code Online (Sandbox Code Playgroud)

  • 您应该在内部查询中添加"AND T1.ACTIVITY = T2.ACTIVITY",否则您将获得某些数据的非正确结果. (4认同)