字符串合并的问题

yfcomeon 2008-09-09 10:01:19
客户编号 客户名 业务员
------- ------- ------
1 北京 甲
2 上海 乙
1 北京 丙
2 上海 丁
3 浙江 丁
本人想实现 类似group的效果,如果客户编号、客户名字段相同,而且业务员有多个的话,将业务员合并成一个字段,请问如何实现。
效果如下

客户编号 客户名 业务员
------- ------- ------
1 北京 甲、丙
2 上海 乙、丁
3 浙江 丁
...全文
127 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
muzhenxing013 2008-09-09
  • 打赏
  • 举报
回复
create table t(
id int not null,
cust varchar(10) not null,
name varchar(100)not null)

insert into T select 1,'北京','甲'
union all select 2,'上海','乙'
union all select 1,'北京','丙'
union all select 2,'上海','丁'
union all select 3,'浙江','丁'
go

select * from t

ALTER function aa
(@A VARCHAR(10))

RETURNS VARCHAR(10)
AS
BEGIN
DECLARE @E VARCHAR(10)
SET @E=''
SELECT @E=@E+','+NAME FROM T WHERE ID=@A
SELECT @E=STUFF(@E,1,1,'')
RETURN @E
END



SELECT DISTINCT ID,CUST,DBO.AA(ID) FROM T

SELECT * FROM T
中国风 2008-09-09
  • 打赏
  • 举报
回复
zjcxc 2008-09-09
  • 打赏
  • 举报
回复
SQL 2005 及之后的版本可以用
create table t(
id int not null,
cust varchar(10) not null,
name varchar(100)not null)

insert into T select 1,'北京','甲'
union all select 2,'上海','乙'
union all select 1,'北京','丙'
union all select 2,'上海','丁'
union all select 3,'浙江','丁'
go

SELECT
*
FROM(
SELECT DISTINCT
id, cust
FROM t
)A
CROSS APPLY(
SELECT names = STUFF(
(
SELECT
N'、' + name
FROM t
WHERE id = A.id
AND cust = A.cust
FOR XML PATH(''), TYPE
).value('/', 'nvarchar(max)'),
1, 1, N'')
)B
go

drop table T
一品梅 2008-09-09
  • 打赏
  • 举报
回复
大体脉络是
1.根据分组参数入参,通过SQL字符串处理,返回字符串
2.写SQL select语句,里面你所需字段调用函数,另外注意GROUP BY 分组.理解了,就能写出来了.
天-笑 2008-09-09
  • 打赏
  • 举报
回复


/*客户编号 客户名 业务员
------- ------- ------
1 北京 甲
2 上海 乙
1 北京 丙
2 上海 丁
3 浙江 丁


客户编号 客户名 业务员
------- ------- ------
1 北京 甲、丙
2 上海 乙、丁
3 浙江 丁

*/
create table t(
id int not null,
cust varchar(10) not null,
name varchar(100)not null)

insert into T select 1,'北京','甲'
union all select 2,'上海','乙'
union all select 1,'北京','丙'
union all select 2,'上海','丁'
union all select 3,'浙江','丁'

select * from T

go
--写一个聚合函数:
create function dbo.fn_GetString(@id int)
returns varchar(8000)
as
begin
declare @r varchar(8000)
set @r=''
select @r=@r+';'+name from T where id=@id
return stuff(@r,1,1,'')
end
go

-- 调用函数
select id,cust, dbo.fn_GetString(id) as name from T group by id,cust

go

drop function fn_GetString

drop table T

dawugui 2008-09-09
  • 打赏
  • 举报
回复
--sql 2000的写法,其他的方法见一楼.

create table tb(客户编号 int, 客户名 varchar(10) , 业务员 varchar(10))
insert into tb values(1 , '北京' , '甲')
insert into tb values(2 , '上海' , '乙')
insert into tb values(1 , '北京' , '丙')
insert into tb values(2 , '上海' , '丁')
insert into tb values(3 , '浙江' , '丁')
go

--创建一个合并的函数
create function f_hb(@客户编号 int , @客户名 varchar(10))
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(业务员 as varchar) from tb where 客户编号 = @客户编号 and 客户名 = @客户名
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct 客户编号,客户名 ,dbo.f_hb(客户编号,客户名) as 业务员 from tb

drop table tb
drop function dbo.f_hb

/*
客户编号 客户名 业务员
----------- ---------- ----------------
1 北京 甲,丙
2 上海 乙,丁
3 浙江 丁

(所影响的行数为 3 行)
*/
lgxyz 2008-09-09
  • 打赏
  • 举报
回复
又是行合并下面是一个例子
你自己修改

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

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

col1 col2
---------- -----------
a 1,2
b 1,2,3
dawugui 2008-09-09
  • 打赏
  • 举报
回复
合并列值
原著:邹建
改编:爱新觉罗.毓华 2007-12-16 广东深圳

表结构,数据如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc

需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)

1. 旧的解决方法(在sql server 2000中只能用函数解决。)
--1. 创建处理函数
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(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO

-- 调用函数
SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id

drop table tb
drop function dbo.f_str

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

--2、另外一种函数.
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 f_hb(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
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 distinct id ,dbo.f_hb(id) as value from tb

drop table tb
drop function dbo.f_hb

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
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 * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM tb N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb

/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
*/

--SQL2005中的方法2
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, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '')
from tb
group by id

/*
id values
----------- --------------------
1 aa,bb
2 aaa,bbb,ccc

(2 row(s) affected)

*/

drop table tb

king520520 2008-09-09
  • 打赏
  • 举报
回复
字段中间加个 加号,就可以了连接起来了
ap0106204 2008-09-09
  • 打赏
  • 举报
回复
MARK

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧