34,593
社区成员
发帖
与我相关
我的任务
分享
--> 测试数据: #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 姓名
/*
姓名 选修课程
---- --------------
李四 语文,数学,化学
张三 语文,数学,物理
*/
--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