将行转换为t-sql中的列 - sql server 2005

时间:2009-03-17 17:13:47

标签: sql-server-2005

我的情况是我在结构中有一个表

ID, name
 1, 'value1'
 1, 'value2'
 2, 'value3'
 2, 'value4'
 1, 'value5'

我想以下列格式显示上述数据

id , combineName
1  ,'value1','value2', 'value5'
2  ,'value3','value4'

在SQL Server 2005中有一种简单的方法可以执行此操作,还是必须运行游标才能执行此操作?

4 个答案:

答案 0 :(得分:1)

SQL 2005有一个PIVOT函数,可以做你想要的。 http://msdn.microsoft.com/en-us/library/ms177410.aspx

答案 1 :(得分:1)

假设您的数据位于表格中:

create  FUNCTION toCSV (@id int)

RETURNS varchar(100)

AS

BEGIN

DECLARE @List varchar(100)

SELECT @List = COALESCE(@List + ', ', '') + 
   CAST(name AS varchar(10))

FROM aTable

WHERE ID = @id

RETURN(@list)

END;

go

然后:

从aTable

中选择不同的ID,dbo.to CSV(id)

答案 2 :(得分:0)

您可以使用嵌套选择执行此操作,或使用pivot运算符更轻松地执行此操作,但您必须事先知道所有可能的值。

如果您希望它是动态的,那么您将需要一个游标和一些动态SQL。

答案 3 :(得分:0)

COALESCE功能的简单示例:

创建了一个Temp表,其中我在WHILE循环的帮助下放置了一行9行。 在主要部分,我刚刚将Column带到了COALESCE功能。

DROP TABLE #Material 设置NOCOUNT ON CREATE TABLE #Material (

MaterialID INT

DECLARE @LoopCounter INT DECLARE @MaxLoopCounter INT

SET @LoopCounter = 1 SET @MaxLoopCounter = 10

WHILE(@LoopCounter< @MaxLoopCounter) 开始     INSERT INTO #Material(MaterialID)VALUES(@LoopCounter) SET @LoopCounter = @LoopCounter + 1 END

/ *主要部分* / DECLARE @MaterialID VARCHAR(100)

SELECT @MaterialID = COALESCE(@MaterialID +',','')+ CAST(MaterialID AS VARCHAR(100))FROM #Material

打印'最终输出:'+ @MaterialID

- SELECT * FROM #Material SET NOCOUNT OFF