转载:将数据库中一个字段对应多个字段合并到同一行的方法

--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
  IF @col1=@col1_old
  SELECT @s=@s+','+CAST(@col2 as varchar)
  ELSE
  BEGIN
  INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
  SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
  END
  FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO


/*==============================================*/


--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
  DECLARE @re varchar(100)
  SET @re=''
  SELECT @re=@re+','+CAST(col2 as varchar)
  FROM tb
  WHERE col1=@col1
  RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO

/*==============================================*/


--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
SELECT col1,col2=CAST(col2 as varchar(100))  
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET  
  @col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
  @col1=col1,
  col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1 col2
---------- -------------
a 1
a 1,2
b 1
b 1,2
b 1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO


/*==============================================*/

 

DECLARE@T2TABLE(x nvarchar(10),y nvarchar(10)) insert@T2SELECT'w',nullUNIONALLSELECT'g',nullUNIONALLSELECT'a',nulldeclare@strnvarchar(40) select@str=isnull(@str,'')+x+','from@T2update@T2set y=left(@str,len(@str)-1) select*from@T2 x y ---------- ----------w w,g,a g w,g,a a w,g,a (3 行受影响)

 

 

 

 

例子: id value ----------- ---------- 1 cool 1 nice 1 wow 2 cool 2 wow 3 cool 3 nice 4 nice 合并字符串之后: id value ----------- -------------1 coolnicewow 2 coolwow 3 coolnice 4 nice --------------------------------------自定义函数createfunction getstr(@idint) returnsvarchar(2000) asbegindeclare@strvarchar(2000) set@str=''select@str=@str+rtrim(value) from getstr where id=@idreturn@strend--------------------------------------------------一条语句实现select id,dbo.string(id) from getstr groupby id
 
 
 
--測試數據
declare @table table
(
id int
,value varchar(10)
);
insert into @table
values
(1,'cool')
,(1,'nice')
,(1,'wow')
,(2,'cool')
,(2,'wow')
,(3,'cool')
,(3,'nice')
,(4,'nice');
--查詢
select id,
(select value as [text()]
from @table
where id=t1.id
for xml path('')
)
from @table t1
group by id

 

posted on 2012-05-22 10:54  Wehord  阅读(508)  评论(0)    收藏  举报