SQL基础知识--多行查询结果拼接

今天在工作中遇到如下这个问题,需要将如下的查询结果,拼接成一行!

 1 select PERSON_NAME from S_PROJECT_MEMBER where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049';  

先直接上代码吧!-------------------------有问题的,麻烦指出--------------------------------------------------------

select  
    CAST(stuff((
        select distinct ','+PERSON_NAME 
        from S_PROJECT_MEMBER  
        where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049' for xml path('')),1,1,'') AS varchar(1000)
    ) 
        AS PERSON_NAMES 
from S_PROJECT_MEMBER 
where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049' GROUP BY PROJECT_ID; 

这里用的知识点有:

for xml path() 函数:

--这里用来做字符串拼接

CAST()函数:

--CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型
cast( "abcdefg" as varchar(2000));

STUFF()函数:

--STUFF()函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符。

--select stuff(列名,开始位置,长度,替代字符串)

DISTINCT 关键字:

--这里可以理解为去重,具体可以百度

AS 关键字:

--取别名 

GROP BY :

--用于分组

下面通过具体的例子来说明吧:    来自于:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html

create table hobby(
hobbyId varchar(32),
hName varchar(32)
)

insert into hobby values('1','爬山');
insert into hobby values('2','游泳');
insert into hobby values('3','爬山');
--将查询结果根据行输出成XML格式
SELECT * FROM hobby FOR XML PATH;
--改变XML行节点的名称
SELECT * FROM hobby FOR XML PATH('MyHobby');
--改变XML列节点的名称
SELECT hobbyID as 'MyCode',hName as 'MyName' FROM hobby FOR XML PATH('MyHobby');
--构建我们喜欢的输出方式
SELECT '[ '+hName+' ]' FROM hobby FOR XML PATH('');

现在我对例子进行应用:

--应用
select distinct ','+hobbyId from hobby for xml path('');
-- for xml path('')  解决连接问题
select hName,(select distinct '+'+hobbyId from hobby h where h.hName = hName for xml path('')) AS A 
from hobby 
group by hName;
-- stuff(String,1,1,'') 去除开始的连接符  +1+2+3  --> 1+2+3
select hName,stuff((select distinct '+'+hobbyId from hobby  for xml path('')),1,1,'') AS A 
from hobby  
group by hName;

--需要查询结果
'爬山' '1'+'3'
'游泳' '2'

--方法一
select hName,stuff((select distinct '+'+hobbyId from hobby where hName = B.hName for xml path('')),1,1,'') AS A 
from hobby B 
group by hName;
--方法二 SELECT B.hName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT hName, (SELECT hobbyId+',' FROM hobby WHERE hName=A.hName FOR XML PATH('')) AS StuList FROM hobby A GROUP BY hName ) B
结果:

第一次写笔记。。。。。2016.06.25

 

转载于:https://www.cnblogs.com/ss805459487/p/5615998.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值