码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2016-06-25 12:17:36      阅读:278      评论:0      收藏:0      [点我收藏+]

标签:

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

 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

 

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

标签:

原文地址:http://www.cnblogs.com/ss805459487/p/5615998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!