0

我有一个数据库表,其中包含在多个办公地点工作的用户。这些位置由一个数字标识,在我的表中,我有几个用户出现在他们工作的每个办公位置的几行上。我想要的是一个 SQL 查询,它将合并记录并在一个字段中显示所有办公地点,以逗号分隔。

这是我原来的表:

Id    UserName    OfficeNumber
---   ---------   -------------
1     user01      200
2     user02      220
3     user01      290
4     user03      089
5     user02      019

运行查询后,我希望我的最终表格如下所示:

Id    UserName    OfficeNumber
---   ---------   -------------
1     user01      200, 290
2     user02      220, 019
3     user03      089

任何帮助将不胜感激。

4

2 回答 2

2

您可以使用 SQL-Servers XML 扩展将行连接到列:

SELECT  ID,
        UserName,
        OfficeNumber = STUFF((  SELECT  ',' + CAST(OfficeNumber AS VARCHAR(3))
                                FROM    YourTable b
                                WHERE   a.UserName = b.UserName
                                FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM    (   SELECT  ID = MIN(ID), UserName
            FROM    YourTable
            GROUP BY UserName
        ) a;

SQL Fiddle 示例

SO上还有一个问题,有人问过这个方法如何工作的复杂性,也有几个答案,这里就不重复解释了。


编辑

只是似乎您没有为每个用户名使用最小 ID,而是重新分配一个新号码作为 ID,如果要根据每个用户名的最低原始 ID 重新分配 ID,那么您可以使用:

SELECT  ID,
        UserName,
        OfficeNumber = STUFF((  SELECT  ',' + CAST(OfficeNumber AS VARCHAR(3))
                                FROM    YourTable b
                                WHERE   a.UserName = b.UserName
                                FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM    (   SELECT  ID = ROW_NUMBER() OVER(ORDER BY MIN(ID)), UserName
            FROM    YourTable
            GROUP BY UserName
        ) a;

SQL-Fiddle 示例

或者,如果它按字母顺序排列,您可以使用

SELECT  ID = ROW_NUMBER() OVER(ORDER BY a.UserName),
        UserName,
        OfficeNumber = STUFF((  SELECT  ',' + CAST(OfficeNumber AS VARCHAR(3))
                                FROM    YourTable b
                                WHERE   a.UserName = b.UserName
                                FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM    YourTable a
GROUP BY a.UserName

SQL-Fiddle 示例

于 2013-10-04T12:41:45.523 回答
1

询问:

SQLFIDDLE示例

SELECT ROW_NUMBER()OVER(ORDER BY c1.UserName) AS Id,
       c1.UserName,
    STUFF((SELECT ', ' +x.OfficeNumber
        FROM Table1 x
        WHERE c1.UserName = x.UserName
        FOR XML PATH ('')
    ),1,1,'') as OfficeNumber
FROM Table1 c1
GROUP BY c1.UserName

结果:

| ID | USERNAME | OFFICENUMBER |
|----|----------|--------------|
|  1 |   user01 |     200, 290 |
|  2 |   user02 |     220, 019 |
|  3 |   user03 |          089 |
于 2013-10-04T12:43:55.273 回答