集结多行的某一列值,利用SQl对数据库实行数据拆分与重组

 

 

集合多行的某1列值
–stuff:删除钦赐的字符,并在内定的起源处插入另一组字符。
create table tb
(id int,col1 varchar(10))
go

 利用SQl对数据库进行数据拆分与构成落成提供以下三种方案:

 select ‘[‘+title_a+’,’+title_b +’]’ from A   for xml path(”)

 select ‘[‘+title_a+’,’+title_b +’]集结多行的某一列值,利用SQl对数据库实行数据拆分与重组。’ from A   for xml path(”)

insert tb select 1 , ‘曾祥展’  
insert tb select 一 , ‘学无穷境’ 
insert tb select 1 , ‘ok’
insert tb select 2 , ‘B’

方法一:

WITH CTE AS (
SELECT A.Id,A.[Uid],UserName FROM (
SELECT A.[id], REPLACE(Split.a.value(‘.’, ‘NVARCHAR(max)’),””,”) AS
[Uid]
FROM 
(
SELECT [id], CAST (‘<M>’ + REPLACE(Uid, ‘,’,
‘</M><M>’) + ‘</M>’ AS XML) AS [Uid] FROM A
) AS A CROSS APPLY [Uid].nodes (‘/M’) AS Split(a)

) A INNER JOIN dbo.B B ON A.[Uid]=B.[Uid]
)
SELECT DISTINCT classList=stuff((select ‘,’ +UserName from CTE B WHERE
A.Id=B.Id for xml path(”)),1,1,”) FROM CTE A

SELECT *, (select ‘[‘+title_a+’,’+title_b +’]’ from A where
A.t_id=B.t_id   for xml path(”))  FROM B

SELECT *, (select ‘[‘+title_a+’,’+title_b +’]’ from A where
A.t_id=B.t_id   for xml path(”))  FROM B

drop table tb

 方法二:

SELECT t.id,classList=STUFF((
SELECT ‘,’+tt1.UserName 
FROM A tt left join B tt1 ON ”+tt.Uid+’,’ like ‘%’+tt1.Uid+’,%’ 
WHERE tt.id=t.id FOR XML PATH(”)),1,1,”)
FROM A t 
ORDER BY t.id

–函数
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

方法三:

select id, (select UserName from B where Uid=t02.item) c into #ttt from
dbo.A as t01 cross apply dbo.split(t01.Uid,’,’) as t02

select id,stuff((select ‘,’+c from dbo.#ttt as tb01 where
tb01.id=tb02.id for xml path(”)),1,1,”) as classList

from dbo.#ttt as tb02 group by id

drop table #ttt

drop function
StrLink

办法三亟需增添内置方法:

create function split(
@string varchar(255),
@separator varchar(255)
)returns @array table(item varchar(255))
as
begin
declare @begin int,@end int,@item varchar(255)
set @begin = 1
set @end=charindex(@separator,@string,@begin)
while(@end<>0)
begin
set @item = substring(@string,@begin,@end-@begin)
insert into @array(item) values(@item)
set @begin = @end+1
set @end=charindex(@separator,@string,@begin)
end
set @item = substring(@string,@begin,len(@string)+1-@begin)
if (len(@item)>0)
997755.com澳门葡京,insert into @array(item)
values(substring(@string,@begin,len(@string)+1-@begin))
return
end

上面们直接看结果吧:

表A:

997755.com澳门葡京 1

表B:

997755.com澳门葡京 2

最后结果:

997755.com澳门葡京 3

跟依照商讨给出的方法,作者个人提交那样的三种,假设有不规则之处,请多多指教。

在此间小编就不多文字咯,因为博客里面写再多文字外人看的时候都是看看最后是还是不是外人要的作用,是就学习不是一贯拉到,接待各位朋友多多指教。

 

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

/*

id   col1

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

 

 

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website