请教一个字段内容合并的问题

qinqindodo 2008-05-13 07:44:06
问题:假设有张表(tb)如下:
编号 姓名 选修课程
1 张三 语文
2 张三 数学
3 张三 物理
4 李四 语文
5 李四 数学
6 李四 化学
想变成(得到如下结果):
姓名 选修课程
---- ------------
李四 语文,数学,化学
张三 语文,数学,物理
-------------------
请问该怎么做呢?多谢
...全文
87 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
teakie 2008-06-06
  • 打赏
  • 举报
回复
access如何实现
qinqindodo 2008-05-13
  • 打赏
  • 举报
回复
哈,问题解决了,非常感谢!
Limpire 2008-05-13
  • 打赏
  • 举报
回复
--> 测试数据: #T
if object_id('tempdb.dbo.#T') is not null drop table #T
create table #T (编号 int,姓名 varchar(4),选修课程 varchar(4))
insert into #T
select 1,'张三','语文' union all
select 2,'张三','数学' union all
select 3,'张三','物理' union all
select 4,'李四','语文' union all
select 5,'李四','数学' union all
select 6,'李四','化学'

-->(1) 2000: 不用函数的解决方案
declare @i int, @max int, @sql varchar(max)
select top 1 @i=1, @max=count(*) from #T group by 姓名 order by 2 desc
while @i<=@max
begin
set @sql=isnull(@sql+'+max(case i when '+ltrim(@i)+' then '',''+','max(case i when '+ltrim(@i)+' then ')+'选修课程 else '''' end)'
set @i=@i+1
end
exec ('select 姓名, 选修课程='+@sql+' from (select *,i=(select count(1) from #T where 姓名=a.姓名 and 选修课程<=a.选修课程) from #T a) t group by 姓名')
/*
姓名 选修课程
---- --------------
李四 化学,数学,语文
张三 数学,物理,语文
*/

-->(2) 2005: 效率高可读性强
select 姓名, 选修课程=(stuff((select ','+选修课程 from #T where 姓名=a.姓名 for xml path('')),1,1,'')) from #T a group by 姓名
/*
姓名 选修课程
---- --------------
李四 语文,数学,化学
张三 语文,数学,物理
*/
liangCK 2008-05-13
  • 打赏
  • 举报
回复
--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
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
GO

--合并处理函数
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
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO
liangCK 2008-05-13
  • 打赏
  • 举报
回复
写个函数.

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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