累加字符串,在线中…

wangyuanping 2006-11-11 11:01:13
表如下:
dm mc
1 ABC
2 CD
3 CE
3 CEB
1 A
结果:
dm mc
1 abc/a
2 cd
3 cd/ceb

这要如何实现。
...全文
306 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
中国风 2006-11-12
  • 打赏
  • 举报
回复
引用一下邹建的文章
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. 旧的解决方法

-- 1. 创建处理函数

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, values=dbo.f_str(id)

FROM tb

GROUP BY id



-- 2. 新的解决方法

-- 示例数据

DECLARE @t TABLE(id int, value varchar(10))

INSERT @t SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'



-- 查询处理

SELECT *

FROM(

SELECT DISTINCT

id

FROM @t

)A

OUTER APPLY(

SELECT

[values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM @t N

WHERE id = A.id

FOR XML AUTO

), '<N value="', ','), '"/>', ''), 1, 1, '')

)N



/*--结果

id values

----------- ----------------

1 aa,bb

2 aaa,bbb,ccc



(2 行受影响)
中国风 2006-11-12
  • 打赏
  • 举报
回复
create table ta (dm int, mc varchar(10))
insert ta
select 1, 'ABC' union all
select 2, 'CD' union all
select 3, 'CE' union all
select 3, 'CEB' union all
select 1, 'A' --楼主少一个A值
create FUNCTION dbo.f_str(@dm int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @sql varchar(8000)
SET @sql = ''
SELECT @sql = @sql + lower(mc)+'/'
FROM ta
WHERE dm=@dm
set @sql = left(@sql,len(@sql) - 1)
return(@sql)
end

select dm,内容=dbo.f_str(dm) from ta group by dm
dm 内容
----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 abc/a
2 cd
3 ce/ceb

(所影响的行数为 3 行)
--drop table ta
--drop function f_str
OracleRoob 2006-11-12
  • 打赏
  • 举报
回复
在SQL Server 2000中,最简单的方法就是写一个函数辅助处理。
marco08 2006-11-12
  • 打赏
  • 举报
回复
用函数比较方便
xyxfly 2006-11-12
  • 打赏
  • 举报
回复
:)
dawugui 2006-11-11
  • 打赏
  • 举报
回复
if object_id('pubs..t') is not null
drop table t
go

create table t(dm int,mc varchar(10))
insert into t(dm,mc) values(1,'ABC')
insert into t(dm,mc) values(2,'CD')
insert into t(dm,mc) values(3,'CE')
insert into t(dm,mc) values(3,'CEB')
insert into t(dm,mc) values(1,'A')
go

--创建一个合并的函数f_hb
if object_id('pubs..f_hb') is not null
drop function f_hb
go

create function f_hb(@dm int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(mc as varchar) from t where dm = @dm
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct dm ,dbo.f_hb(dm) as mc from t

drop table t
drop function f_hb

--结果
dm mc
----------- ------
1 ABC,A
2 CD
3 CE,CEB

(所影响的行数为 3 行)

hhhdyj 2006-11-11
  • 打赏
  • 举报
回复
用函数
CREATE TABLE tb([dm] int, [mc] varchar(100))
INSERT INTO tb
SELECT 1, 'ABC'
UNION ALL SELECT 2, 'CD'
UNION ALL SELECT 3, 'CE'
UNION ALL SELECT 3, 'CEB'
UNION ALL SELECT 1, 'A'
GO
CREATE FUNCTION AddStr(@dm INT)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @re VARCHAR(100)
SET @re = ''
SELECT @re = @re + ISNULL(MC, '') +'/' FROM tb WHERE dm = @dm
RETURN LEFT(@re,LEN(@re) -1)
END
GO

SELECT DISTINCT A.dm,dbo.AddStr(dm) FROM tb A

DROP FUNCTION AddStr
DROP TABLE tb
dawugui 2006-11-11
  • 打赏
  • 举报
回复
SQL语句之合并行列转换

  有表rowtocol,其数据如下:
  a b
  1 1
  1 2
  1 3
  2 1
  2 2
  3 1
  如何转换成如下结果:
  a b
  1 1,2,3
  2 1,2
  3 1

  创建一个合并的函数   

  create function f_rowtocol(@a int)
  returns varchar(8000)
  as
  begin
   declare @str varchar(8000)
   set @str = ''
   select @str = @str + ',' + cast(b as varchar) from rowtocol where a = @a
   set @str = right(@str , len(@str) - 1)
   return(@str)
  End
  go

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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