2012-09-15 123 views
11
 
Customer Table 
-------------- 
ID Name 
1 James 
2 Peter 
 
Order Table 
--------------- 
OrderId CustId 
100  1 
101  1 
102  2 

我怎么能写一个返回这样逗号在一列分隔值 - SQL SERVER

 
ID,Name,ListofOrders 
1,James,"100,101" 
2,Peter,"102" 

在Sybase东西,我有一个函数调用列表,我可以使用它,但我查询不发现SQL Server中的类似功能

+1

[Here](http://bradsruminations.blogspot.com/2009/10/making-list-and-checking -it-twice.html),您可以找到复杂的解决方案和解释。 – WojtusJ

+0

哇,这是一个复杂的解决方案:) Sybase的LIST功能要好得多。想知道为什么SQL服务器没有这个简单的东西 – JanetOhara

回答

12

请尝试:

select ID, [Name], 
(select OrderID+',' from OrderTable where CustID=ID 
group by OrderID for xml path('')) AS ListOfOrders 
From CustomerTable 
+0

谢谢你Techdo – JanetOhara

1

创建一个用户定义函数如下图所示

CREATE FUNCTION [dbo].[CommaSeperatedOrderIDs](@CustId INT) returns varchar(Max) 
AS 
BEGIN 

DECLARE @CommaSeperatedValues VARCHAR(MAX) 
SELECT @CommaSeperatedValues = COALESCE(@CommaSeperatedValues+',' , '') + OrderID 
FROM OrderTable WHERE CustId = @CustId 
RETURN @CommaSeperatedValues 

END 

然后,

select ID, [Name], ([dbo].[CommaSeperatedOrderIDs](ID)) AS ListofOrders 
From CustomerTable 
0

从Sheikh Haris'link添加全部细节。

对于这个表:

enter image description here

要获得输出,如:

enter image description here

使用下面的SQL:

SELECT field1, 
    Substring(convert(varchar(100), 
    (
    SELECT (', ' + field2) 
     FROM #test t2 
     WHERE t1.field1 = t2.field1 
     ORDER BY field1, field2 
    FOR XML PATH('') 
        )), 3, 1000) 
FROM #test t1 
GROUP BY field1 

我添加了一个转换函数的子字符串,以便显示WIDEMEMO字段(SQL Server)