将重复记录合并到1个字段中

时间:2009-02-09 09:28:35

标签: sql sql-server tsql

我有一个包含联系人列表的数据库表,其中一些联系人可能有多个记录,例如

CustomerID, CustomerName, Vehicle
1, Dan, Mazda
1, Dan, Suzuki
2, John, Ford
3, Dasha, Volvo
3, Dasha, Ford

我可以编写一个select查询来返回不同的customerID和CustomerName,以及1条记录中的车辆列表吗?即。

1, Dan, Mazda+Suzuki
2, John, Ford
3, Dasha, Volvo+Ford

由于

3 个答案:

答案 0 :(得分:3)

有一些nice answers to this problem on another question

根据the linked article,由于使用了XML函数,因此仅适用于SQL Server 2005。来自文章 -

SELECT table_name, 
       LEFT(column_names,LEN(column_names) - 1)   AS column_names 
FROM   (SELECT table_name, 
               (SELECT column_name + ',' AS [text()] 
                FROM   information_schema.columns AS internal 
                WHERE  internal.table_name = table_names.table_name 
                FOR xml PATH ('') 
               ) AS column_names 
        FROM   (SELECT   table_name 
                FROM     information_schema.columns 
                GROUP BY table_name) AS table_names) AS pre_trimmed;
  

第二版(诚然受到启发   this post,我偶然发现了   写第一个版本):

SELECT table_name, 
       LEFT(column_names,LEN(column_names) - 1)   AS column_names 
FROM   information_schema.columns AS extern 
       CROSS APPLY (SELECT column_name + ',' 
                    FROM   information_schema.columns AS intern 
                    WHERE  extern.table_name = intern.table_name 
                    FOR XML PATH('') 
                   ) pre_trimmed (column_names) 
GROUP BY table_name,column_names;
  

第二个CROSS APPLY版本是   据说比较慢   执行计划,但我没有进行   任何基准都可以。

答案 1 :(得分:1)

我不确定是否可以通过单个sql完成。但是,上次我在sybase的tsql中尝试这个时,我使用了临时表和游标。所以它至少可以使用那条路线完成。

答案 2 :(得分:0)

我很确定你不能通过单个SQL查询来完成它。

如果这是常规要求,则应为每个客户ID调用一个函数。

SELECT   abc.CustomerID,
         dbo.udf_getCSVCustomerVehicles(abc.customerID)
FROM     (SELECT DISTINCT CustomerID
          FROM   TABLE) abc
ORDER BY abc.CustomerID

然后创建一个标量函数,将值合并为一个变量并返回结果。