合并多行的某一列值

简介:

--合并多行的某一列值 
--
stuff:删除指定的字符,并在指定的起点处插入另一组字符。 
create table tb 
(id 
int,col1 varchar(10)) 
go 

insert tb select 1 , '曾祥展'   
insert tb select 1 , '学无止境'  
insert tb select 1 , 'ok' 
insert tb select 2 , 'B' 

drop table tb 

--函数 
create function StrLink(@id int
returns varchar(8000
as 
begin  
declare @sql varchar(8000)      
set @sql=''  
select @sql=@sql+','+col1 from tb where id=@id  
set @sql=stuff(@sql,1,1,'')  
return @sql 
end 

drop function StrLink 


select * from tb 
select col=dbo.StrLink(1

/* 

id   col1 
----------- 
1    曾祥展 
1    学无止境 
1    ok 
2    B 


     col 
------------------ 
曾祥展,学无止境,ok 

*/

 

 

 declare @Temp TABLE([Col1] varchar(50), [Col2] varchar(100)) 

Insert  @Temp   
Select  ' a ' ' asd '  union 
Select  ' a ' ' rdf '  union 
Select  ' a ' ' dmg '  union 
Select  ' b ' ' kk '  union 
Select  ' b ' ' useh ' 
-- 第一种方法
select  a. [ Col1 ] , stuff (( select ' , ' + b. [ Col2 ]  from  @Temp  as  b  where  a. [ Col1 ]  =  b. [ Col1 ]  for  xml path( '' )), 1 , 1 , '' as  res 
from  @Temp  a 
group  by  a. [ Col1 ] 

-- 或者
SELECT  DISTINCT
[ Col1 ] ,
[ Col2 ]  =  SUBSTRING ((  SELECT  ' '  +  [ Col2 ]  as  [ text() ]
FROM  @Temp  t2
WHERE  t2.Col1  =  t1.Col1
FOR  XML path( '' ), elements
),  2 100
)
FROM  @Temp  t1


--结果:
          a asd,dmg,rdf 
          b kk,useh

 

 

 

广西壮族自治区,玉林市,玉州区

 

复制代码
create index ix_id on 中国(id)
create index ix_pid on 中国(pid)

    
   -- update dbo.中国 set allname= dbo.GetAllName(id)  
   -- select   dbo.GetAllName(450902)
   
create function GetAllName (@id int)
returns varchar(8000)
as 
    begin  
        declare @sql varchar(8000)      
        set @sql='';
            with    T(flag, id, pid, [name])
                      as (select    @id as flag, id, pid, [name]
                          from      中国 a
                          where     1=1 and a.id=@id
                          union all
                          select    @id as flag, b.id, b.pid, b.[name]
                          from      中国 b
                          inner join T c on c.pid=b.id)
                 --  SELECT   *       FROM     T   WHERE pid !=0      
select  @sql=@sql+','+[name]
from    T
where   id!=1
order by id 
        set @sql=stuff(@sql, 1, 1, '')  
        return @sql

    end
复制代码

 

    本文转自曾祥展博客园博客,原文链接:http://www.cnblogs.com/zengxiangzhan/archive/2010/01/03/1638169.html,如需转载请自行联系原作者


相关文章
|
2月前
|
分布式计算 Hadoop 数据处理
什么是“合并器”?
【8月更文挑战第31天】
22 0
更改元素的值
代码示例修改了首个 `<title>` 元素的文本节点值,将它变为 "Easy Cooking"。步骤包括加载 "books.xml" 到 xmlDoc,获取第一个 `<title>` 的子节点,然后设置其nodeValue。
|
5月前
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
【全网最简短代码】筛选出新数组中和旧数组的重复项,并和旧数组合并(往数组追加新的数据对象且去重,合并两个数组不重复数据)
|
5月前
|
JSON 算法 前端开发
2722. 根据 ID 合并两个数组
2722. 根据 ID 合并两个数组
30 0
|
12月前
删除数组中重复出现的值
删除数组中重复出现的值
66 0
两个有序链表序列的合并(附加代码模式)
两个有序链表序列的合并(附加代码模式)
57 1
|
SQL 存储 缓存
索引合并,能不用就不要用吧!
索引合并,能不用就不要用吧!
|
算法
算法练习——(3)合并数组
有两个已经排好序的数组,A:{9,28,38,40,56,65,78,82} B:{13,21,33,38,45},请定义一个新数组,将这两个数组中的数据合并到新数组中并且保证数据仍然是有序的。
lodash合并函数,可以定制合并值
lodash合并函数,可以定制合并值
105 0