無論是在sql 2000, 還是在 sql 2005 中,都沒有提供字串的聚合函式, 所以, 當我們在處理下列要求時,會比較麻煩:
有表tb, 如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到結果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即, group by id, 求 value 的和(字串相加)
這個問題的一般處理方法是, 寫乙個聚合函式:
create function dbo.f_str(@id int)
returns varchar(8000)
asbegin
declare @r varchar(8000)
set @r=''
select @r=@r+','+value from tb where id=@id
return stuff(@r,1,1,'')
endgo
-- 呼叫函式
select id, values=dbo.f_str(id) from tb group by id
這樣的問題是,函式不通用,必須為每個要處理的表編寫相應的處理函式
在sql2005中,這個問題的更好解決辦法是寫乙個clr函式,用於實現字串的聚合,這樣可以解決通用性的問題了。
而在我下面要實現的, 是只用一條sql語句來完成這個功能
(絕對是一條, 不會是用exec()取巧的那種)
-- 示例資料
declare @t table(id int, value varchar(10))
insert @t select 1, 'aa'
union all select 1, 'bb'
union all select 2, 'aaa'
union all select 2, 'bbb'
union all select 2, 'ccc'
/*--結果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影響)
--*/
sql 2005新增了xml資料型別, 而且xml資料型別可以方便的與字元型別之間做轉換,上面的方法只是巧妙地利用了這一點,結合字串的一些處理函式就出來結果了
-- 下面這個示例也是合併字串的, 以系統表為列, 合併兩列
SQL Server2000和2005中合併列值
有表 tb,如下 id value 1 aa 1 bb 2 aaa 2 bbb 2 ccc 需要得到結果 id values 1 aa,bb 2 aaa,bbb,ccc 在sql server2000 中我們處理的方式一般都是用自定義函式去處理 舉例如下 create function dbo.f ...
L2 005 集合相似度
給定兩個整數集合,它們的相似度定義為 nc nt 100 其中nc是兩個集合都有的不相等整數的個數,nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。輸入格式 輸入第一行給出乙個正整數n 50 是集合的個數。隨後n行,每行對應乙個集合。每個集合首先給出乙個正整數m 1...
L2 005 集合相似度
給定兩個整數集合,它們的相似度定義為 nc nt 100 其中nc是兩個集合都有的不相等整數的個數,nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。輸入第一行給出乙個正整數n 50 是集合的個數。隨後n行,每行對應乙個集合。每個集合首先給出乙個正整數m 104 是集...