-- drop table #tb
create table #tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into #tb values('张三' , '语文' , 74)
insert into #tb values('张三' , '数学' , 83)
insert into #tb values('李四' , '语文' , 74)
insert into #tb values('李四' , '数学' , 84)
insert into #tb values('李四' , '物理' , 94)
select stuff('语文', 1,0, '数学')
--数学语文
select 课程 from #tb for xml path('')
--<课程>语文</课程><课程>数学</课程><课程>语文</课程><课程>数学</课程><课程>物理</课程>
SELECT 课程+'/' FROM #tb B FOR XML PATH('')
--语文/数学/语文/数学/物理/
SELECT 姓名,(SELECT 课程+'/' FROM #tb B WHERE A.姓名=B.姓名 FOR XML PATH('')) AS 课程
FROM #tb A
/*
张三 语文/数学/
张三 语文/数学/
李四 语文/数学/物理/
李四 语文/数学/物理/
李四 语文/数学/物理/
*/
SELECT 姓名,RIGHT(课程,LEN(课程)-1) 课程,RIGHT(分数,LEN(分数)-1) 分数
FROM (
SELECT distinct 姓名
,(SELECT '/'+课程 FROM #tb B WHERE A.姓名=B.姓名 FOR XML PATH('')) AS 课程
,(SELECT '/'+convert(VARCHAR(10),分数) FROM #tb B WHERE A.姓名=B.姓名 FOR XML PATH('')) AS 分数
FROM #tb A
) KK
--或
select 姓名
,选择课程=stuff((select ','+课程 from #tb where 姓名=t.姓名 for xml path('')),1,1,'')
,分数=stuff((select ','+convert(VARCHAR(10),分数) from #tb where 姓名=t.姓名 for xml path('')),1,1,'')
from #tb t
group by 姓名
/*
姓名 选择课程 分数
---------- ----------------- -------------------
李四 语文,数学,物理 74,84,94
张三 语文,数学 74,83
(2 行受影响)
*/
CREATE FUNCTION dbo.fn_getStr(@NAME VARCHAR(20))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + (CASE WHEN ISNULL(课程,'')='' THEN '' ELSE ','+ISNULL(课程,'') END)
FROM tb
WHERE 姓名=@NAME
RETURN STUFF(@r, 1, 1, '')
END
GO
SELECT 姓名,dbo.fn_getStr(姓名) AS 课程
FROM tb
GROUP BY 姓名
/*
姓名 课程
---------- -------------------
李四 语文,数学,物理
张三 语文,数学
(2 行受影响)
*/