SQL SERVER 中將重復記錄合並為一條記錄


合並列值
原著:鄒建
改編:愛新覺羅.毓華 
2007-12-16  廣東深圳

表結構,數據如下:
id    value
----- ------
1     aa
1     bb
2     aaa
2     bbb
2     ccc

需要得到結果:
id    
values
------ -----------
1      aa,bb
2      aaa,bbb,ccc
即:
groupby id, 求 value 的和(字符串相加)

1. 舊的解決方法(在sql server 2000中只能用函數解決。)
--1. 創建處理函數
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go

CREATEFUNCTION dbo.f_str(@idint)
RETURNSvarchar(8000)
AS
BEGIN
   
DECLARE@rvarchar(8000)
   
SET@r=''
   
SELECT@r=@r+','+ value FROM tb WHERE id=@id
   
RETURNSTUFF(@r, 1, 1, '')
END
GO

-- 調用函數
SELECt id, value = dbo.f_str(id) FROM tb GROUPBY id

droptable tb
dropfunction dbo.f_str

/*
id          value     
----------- -----------
1           aa,bb
2           aaa,bbb,ccc
(所影響的行數為 2 行)
*/

--2、另外一種函數.
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go

--創建一個合並的函數
createfunction f_hb(@idint)
returnsvarchar(8000)
as
begin
 
declare@strvarchar(8000)
 
set@str=''
 
select@str=@str+','+cast(value asvarchar) from tb where id =@id
 
set@str=right(@str , len(@str) -1)
 
return(@str)
End
go

--調用自定義函數得到結果:
selectdistinct id ,dbo.f_hb(id) as value from tb

droptable tb
dropfunction dbo.f_hb

/*
id          value     
----------- -----------
1           aa,bb
2           aaa,bbb,ccc
(所影響的行數為 2 行)
*/

2. 新的解決方法(在sql server 2005中用OUTER APPLY等解決。)
createtable tb(id int, value varchar(10))
insertinto tb values(1, 'aa')
insertinto tb values(1, 'bb')
insertinto tb values(2, 'aaa')
insertinto tb values(2, 'bbb')
insertinto tb values(2, 'ccc')
go
-- 查詢處理
 

  SELECT * FROM(SELECT DISTINCT id FROM tb) A OUTER APPLY(
        SELECT[value]=STUFF(REPLACE(REPLACE(
            (
                SELECT value FROM tb N
                WHERE N.id = A.id
                FOR XML AUTO
            ), '<N value="', ','), '"/>', ''), 1, 1, '')
)n
 OUTER APPLY(
        SELECT[value2]=STUFF(REPLACE(REPLACE(
            (
                SELECT value2 FROM tb N2
                WHERE N2.id = A.id
                FOR XML AUTO
            ), '<N2 value2="', ','), '"/>', ''), 1, 1, '')
)n2

droptable tb

/*
id          values
----------- -----------
1           aa,bb
2           aaa,bbb,ccc

(2 行受影響)
*/


免責聲明!

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



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