sqlserver 同列字符连接相加



--	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 行受影响)
*/





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值