SQLServer数据库字段合并
小职 2018-07-02 来源 : 阅读 1496 评论 0

摘要:本文主要向大家介绍了SQLServer数据库字段合并,通过具体的内容向大家展示,希望能对大家学习SQLServer数据库有所帮助。

本文主要向大家介绍了SQLServer数据库字段合并,通过具体的内容向大家展示,希望能对大家学习SQLServer数据库有所帮助。

 --建立测试环境

IF OBJECT_ID('tb') IS NOT NULL  DROP TABLE tb
GO
CREATE TABLE tb
(
 id int identity, 
 houseName varchar(10),
 proid int,
    procount int
)
GO
INSERT TB
SELECT 'A仓库',1,100 union all 
SELECT 'A仓库',2,50 union all 
SELECT 'B仓库',1,60 union all 
SELECT 'B仓库',2,70
--查询
--1
IF OBJECT_ID('f_getproid') IS NOT NULL  DROP function f_getproid
GO
create function f_getproid (@houseName varchar(10))
returns varchar(50)
as
begin
declare @s varchar(50)
select @s=isnull(@s+',','')+ltrim(proid) from tb where houseName=@houseName
return @s
end
go
IF OBJECT_ID('f_getprocount') IS NOT NULL  DROP function f_getprocount
GO
create function f_getprocount (@houseName varchar(10))
returns varchar(50)
as
begin
declare @s varchar(50)
select @s=isnull(@s+',','')+ltrim(procount) from tb where houseName=@houseName
return @s
end
go
select houseName,dbo.f_getproid(houseName)proid,dbo.f_getprocount(houseName)procount from tb group by houseName
go
--2
select houseName,
stuff((select ','+ltrim(proid) from tb where houseName=t.houseName for xml path('')),1,1,'') proid,
stuff((select ','+ltrim(procount) from tb where houseName=t.houseName for xml path('')),1,1,'') procount
from tb t
group by houseName

--结果
/*
(4 行受影响)
houseName  proid procount
---------- ----- --------
A仓库        1,2   100,50
B仓库        1,2   60,70
(2 行受影响)
houseName  proid procount
---------- ----- --------
A仓库        1,2   100,50
B仓库        1,2   60,70
(2 行受影响)
*/
 
/*
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-06
地点:广东深圳
描述:将如下形式的数据按id字段合并value字段。
id    value
----- ------
1     aa
1     bb
2     aaa
2     bbb
2     ccc
需要得到结果:
id     value
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)
*/
--1、sql2000中只能用自定义的函数解决
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
create function dbo.f_str(@id int) returns varchar(100)
as
begin
    declare @str varchar(1000)
    set @str = ''
    select @str = @str + ',' + cast(value as varchar) from tb where id = @id
    set @str = right(@str , len(@str) - 1)
    return @str
end
go
--调用函数
select id , value = dbo.f_str(id) from tb group by id
drop function dbo.f_str
drop table tb


--2、sql2005中的方法

create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
from tb
group by id
drop table tb


--3、使用游标合并数据

create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
declare @t table(id int,value varchar(100))--定义结果集表变量
--定义游标并进行合并处理
declare my_cursor cursor local for
select id , value from tb
declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
open my_cursor
fetch my_cursor into @id , @value
select @id_old = @id , @s=''
while @@FETCH_STATUS = 0
begin
    if @id = @id_old
       select @s = @s + ',' + cast(@value as varchar)
    else
      begin
        insert @t values(@id_old , stuff(@s,1,1,''))
        select @s = ',' + cast(@value as varchar) , @id_old = @id
      end
    fetch my_cursor into @id , @value
END
insert @t values(@id_old , stuff(@s,1,1,''))
close my_cursor
deallocate my_cursor
select * from @t
drop table tb

本文由职坐标整理并发布,了解更多内容,请关注职坐标SQL Server数据库频道!

本文由 @小职 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程