Sql server 将多行合并为一行

Sql server 将多行合并为一行,sql-server,sql-server-2008,Sql Server,Sql Server 2008,我想知道在另一个视图中将以下行中的数据合并到一行中的最佳方法 这些是当前显示的结果 Type_ID | Client_ID | PBX_Vendor | 127 | 090820006311404926326C | Aastra | 127 | 090820006311404926326C | Ericsson | 127 | 111012237401404926326C | Aastra | 127 | 1

我想知道在另一个视图中将以下行中的数据合并到一行中的最佳方法

这些是当前显示的结果

 Type_ID | Client_ID              | PBX_Vendor |
 127     | 090820006311404926326C | Aastra     |
 127     | 090820006311404926326C | Ericsson   |
 127     | 111012237401404926326C | Aastra     |
 127     | 120209287521404926326C | Aastra     |
 127     | 120209287521404926326C | Alcatel    |
以下是我希望看到的数据

 Type_ID | Client_ID              | PBX_Vendor       |
 127     | 090820006311404926326C | Aastra, Ericsson |
 127     | 111012237401404926326C | Aastra           |
 127     | 120209287521404926326C | Aastra, Alcatel  |
基本上,有多个PBX供应商与一个客户端ID相关联。对于帮助台系统,我需要在一行中显示此信息

我已经在CONCAT上尝试过了,但我最终得到的只是一行,其中有100多家供应商,它们不是特定于客户机ID的


非常感谢您对我们的任何帮助

以下是一种方法(也适用于2005年):

表格

DECLARE @table TABLE
    (
      [Type_ID] INT,
      [Client_ID] VARCHAR(50),
      [PBX_Vendor] VARCHAR(50)
    )
数据

INSERT  INTO @table
        SELECT  127,
                '090820006311404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '090820006311404926326C',
                'Ericsson'
        UNION ALL
        SELECT  127,
                '111012237401404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '120209287521404926326C',
                'Aastra'
        UNION ALL
        SELECT  127,
                '120209287521404926326C',
                'Alcatel'
查询

SELECT  [Type_ID],
        [Client_ID],
        (
          SELECT    STUFF((
                            SELECT  ',' + [PBX_Vendor]
                            FROM    @table
                            WHERE   [Client_ID] = tbl.[Client_ID]
                                    AND [Type_ID] = tbl.[Type_ID]
                            GROUP BY [PBX_Vendor]
                            ORDER BY [PBX_Vendor]
                          FOR
                            XML PATH('')
                          ), 1, 1, '')
        ) PBX_Vendor
FROM    @table tbl
GROUP BY [Type_ID],
        [Client_ID]
结果

Type_ID     Client_ID               PBX_Vendor
127         090820006311404926326C  Aastra,Ericsson
127         111012237401404926326C  Aastra
127         120209287521404926326C  Aastra,Alcatel

丹,我用你原来的想法做了一些修改,终于成功了。虽然我不能将其保存为视图,因为我知道您不能将声明保存为视图

DECLARE @table TABLE
    (
      [Type_ID] INT,
      [Client_ID] VARCHAR(50),
      [PBX_Vendor] VARCHAR(50)
    )

INSERT  INTO @table
        SELECT  dbo.AMGR_User_Fields_Tbl.Type_Id, dbo.AMGR_User_Fields_Tbl.Client_Id, dbo.AMGR_User_Field_Defs_Tbl.Description AS PBX_Vendor
            FROM    dbo.AMGR_User_Fields_Tbl INNER JOIN
                    dbo.AMGR_User_Field_Defs_Tbl ON dbo.AMGR_User_Fields_Tbl.Type_Id = dbo.AMGR_User_Field_Defs_Tbl.Type_Id AND 
                    dbo.AMGR_User_Fields_Tbl.Code_Id = dbo.AMGR_User_Field_Defs_Tbl.Code_Id
            WHERE     (dbo.AMGR_User_Fields_Tbl.Type_Id = 127)

SELECT  [Type_ID],
        [Client_ID],
        (
          SELECT    STUFF((
                            SELECT  ', ' + [PBX_Vendor]
                            FROM    @table
                            WHERE   [Client_ID] = tbl.[Client_ID]
                                    AND [Type_ID] = tbl.[Type_ID]
                            GROUP BY [PBX_Vendor]
                            ORDER BY [PBX_Vendor]
                          FOR
                            XML PATH('')
                          ), 1, 1, '')
        ) PBX_Vendor
FROM    @table tbl
GROUP BY [Type_ID],
        [Client_ID]

当你有机会时,请选择一个答案作为正确答案-它将帮助你在将来获得更快/更好的答案。。。好的,不是真的,但是我们喜欢这么说。Dan我恐怕我不能用我现有的代码来实现这一点。我必须补充一点,我使用Sql Management Studio来开发这个,因为我没有接受Sql培训。还有其他建议吗?我设法将上面的表转换为我的表,但我得到的错误是“将varchar值转换为int数据类型时转换失败”。这一定是因为我已经从我的原始视图中应用了一个查找。对不起,我必须查看所有数据才能了解您所做的操作。我也在SSMS中编写了这个示例—这是我们大家都使用的:)您是否将数据插入到我的变量表中?如果是的话。。。不要。只需在查询中将“FROM@table”更改为数据库中的表(两个位置)。Dan,感谢您迄今为止的帮助。我将尝试为您进一步细分:不要忘记将我的答案标记为选定答案(2年后)不要忘记将我的答案标记为选定答案(5年后)