sql server 中擁有相同欄位值的記錄某個欄位合并問題解答

來源:互聯網
上載者:User

一、問題

有表如下:

如何獲得如下結果:

二、解法一

使用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

三、說明

這裡合并的欄位都是字串,下一次我會討論如何對整形數字求和。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.