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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM