一、問題
有表如下:
如何獲得如下結果:
二、解法一
使用xml轉換
代碼如下:
CREATE TABLE body(ID int,BODY nvarchar(20))goINSERT INTO body VALUES(1,'aaaa')INSERT INTO body VALUES(2,'bbbb')INSERT INTO body VALUES(1,'cccccc')INSERT INTO body VALUES(3,'ddddd')goSELECT * FROM bodySELECT distinct a.ID,stuff((SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')),1,1,'') AS BODYFROMbody a--具體思路是這樣的:SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')--這條語句的作用是按照a中的ID尋找body表中ID=a.ID的所有記錄,並把它轉換成一個xml(關於將查詢集轉換成xml的文章,--部落格園有很多的,你可以去看看)stuff((SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')),1,1,'')--這條語句的作用是把產生的xml前面的一個逗號去掉並轉化成標量值--最後用一個distinct去掉重複的記錄
解法二
使用遊標,這裡我定義了一個函數,你也可以改成預存程序之類的
USE MyTestgo--自訂函數根據ID返回串連後的body(我的資料庫名叫body)CREATE FUNCTION Getresult(@id int)RETURNS nvarchar(20)ASBEGINDECLARE @resultstr nvarchar(100),@tempstr nvarchar(20)DECLARE @tempid intDECLARE mycursor CURSORFOR SELECT * FROM bodyOPEN mycursorFETCH next FROM mycursor INTO @tempid,@tempstrWHILE (@@FETCH_STATUS=0)BEGINIF(@tempid=@id)BEGINSET @tempstr=stuff(@tempstr,1,0,',')SET @resultstr=stuff(@tempstr,1,0,@resultstr)END FETCH next FROM mycursor INTO @tempid,@tempstrENDSET @resultstr=STUFF(@resultstr,1,1,'')CLOSE mycursorDEALLOCATE mycursorRETURN (@resultstr)END--函數建好後,執行以下SQL語句SELECT distinct m.ID, dbo.Getresult(m.ID) AS BODYFROMbody AS m
三、說明
這裡合并的欄位都是字串,下一次我會討論如何對整形數字求和。