【问题标题】:GROUP BY to combine/concat a column [duplicate]GROUP BY 组合/连接一列[重复]
【发布时间】:2013-02-15 18:31:32
【问题描述】:

我有一张如下表:

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

我想按用户和活动分组,这样我最终会得到类似的结果:

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

如您所见,PageURL 列组合在一起,并根据 group by 用逗号分隔。

非常感谢任何指示和建议。

【问题讨论】:

标签: sql sql-server sql-server-2008 group-by


【解决方案1】:
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

【讨论】:

  • 不错!详细说明:您正在使用 STUFF() 删除连接的 PageUrl 字符串的第一个逗号。 PageUrl 字符串本身是通过使用带有空路径的FOR XML PATH() 创建的,以连接检索到的 PageUrls。非常聪明:) 一些来源:STUFF():msdn.microsoft.com/en-us/library/ms188043.aspxFOR XML:simple-talk.com/sql/learn-sql-server/…
  • 这是对用户问题的有效回答。但是,如果您能解释一下查询中发生了什么以及它为什么起作用,那将是一个更好的答案。
  • 添加 DISTINCT 子句以避免同一用户的重复页面 url
  • 为什么这个查询对我来说是永远的?超时。
  • @Adam 这是SQL Server 不是MySQL
【解决方案2】:

一个好问题。应该告诉你破解这个需要一些时间。这是我的结果。

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

【讨论】:

  • 你应该在内部查询中添加AND T1.ACTIVITY = T2.ACTIVITY,否则你会得到一些数据不正确的结果。
猜你喜欢
  • 2023-02-11
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2019-01-15
  • 1970-01-01
相关资源
最近更新 更多