本文**於t-sql:字串分組聚合,也許你還有更簡單的辦法?
今天在看訂閱的rss的時候,看到這麼乙個問題:t-sql中如何對分組的資訊進行聚合,並以逗號連線字元;也就是對乙個表中的某個字段進行分組,然後對另乙個字段聚合,如果表達得不太清楚,請看下面的表。
原表:parent
child
charles
william
charles
harry
anne
peter
anne
zara
andrew
beatrice
andrew
eugenie
處理後的結果:
parent
children
charles
william,harry
anne
peter,zara
andrew
eugenie,beatrice
貌似很簡單,以我的思考,先寫乙個聚合函式,然後再查詢語句裡面呼叫這個聚合函式;實際上還有更簡單的辦法,這是作者給出的解決辦法,沒有用到自定義聚合函式,他用的是for xml path(『』)這樣的處理方式,感覺真是爽
with
t as
(select
'charles
'parent,
'william
'child
union
select
'charles',
'harry
'union
select
'anne',
'peter
'union
select
'anne',
'zara
'union
select
'andrew',
'beatrice
'union
select
'andrew',
'eugenie')
select
parent,
stuff
( (
select',
'+child
from
t awhere
b.parent
=a.parent
forxml path(
'')),1,
1,'') children
from
t b
group
byparent
複製**
複製**
如果你還有其他的解決辦法,希望你也能給出你的答案, 多多益善
考慮到不熟悉stuff()這個函式,故根據這個思路自己寫了另外的方法:
select parent,right(list,len(list)-
1)from
(select parent,
(select',
'+ children
from t a
where a.parent=b.parent
for xml path(''))
as list
from t b
group
by parent
) x複製**
最終查詢出來的結果集和使用上面的stuff函式是一樣的.
另外補充一下關於stuff函式的用法:
/*用法描述:
stuff(expression1_str,startindex,lengthint,expression2_str)函式共有四個引數,其功能是將expression1_str中自startindex位置起刪除lengthint個字元,然後將expression2插入到expression1_str中的startindex位置。
*/select 'abcdefg'
select stuff('abcdefg',1,0,'1234') --結果為'1234abcdefg'
select stuff('abcdefg',1,1,'1234') --結果為'1234bcdefg'
select stuff('abcdefg',2,1,'1234') --結果為'a1234cdefg'
select stuff('abcdefg',2,2,'1234') --結果為'a1234defg'
--一般的程式語言和sql語言一樣,都把字串當作字元陣列處理,但乙個差別在於,大多數程式語言的陣列下標起始位為0,而sql server中為1,由於慣性思維,常常把一般程式語言中的0起始位帶至sql程式設計中。
原表:parent
child
charles
william
charles
harry
anne
peter
anne
zara
andrew
beatrice
andrew
eugenie
處理後的結果:
parent
children
charles
william,harry
anne
peter,zara
andrew
eugenie,beatrice
貌似很簡單,以我的思考,先寫乙個聚合函式,然後再查詢語句裡面呼叫這個聚合函式;實際上還有更簡單的辦法,這是作者給出的解決辦法,沒有用到自定義聚合函式,他用的是for xml path(『』)這樣的處理方式,感覺真是爽
with
t as
(select
'charles
'parent,
'william
'child
union
select
'charles',
'harry
'union
select
'anne',
'peter
'union
select
'anne',
'zara
'union
select
'andrew',
'beatrice
'union
select
'andrew',
'eugenie')
select
parent,
stuff
( (
select',
'+child
from
t awhere
b.parent
=a.parent
forxml path(
'')),1,
1,'') children
from
t b
group
byparent
複製**
複製**
如果你還有其他的解決辦法,希望你也能給出你的答案, 多多益善
根據字串分組
今天要做乙個根據字串分組,然後集體執行乙個操作,想了一上午,動態建立陣列什麼的,最後還是用了list。list alllist new arraylist string m1 a123 x1 string m2 a124 x1 string m3 a125 x2 string m4 a126 x2 ...
HANA Oracle字串聚合函式
應用場景 在資料進行分組時,需要將字串型別的字段進行聚合。如需將資料更改為 company dept pcode 公司1部門1 100254 公司1部門2 100245 company dept 公司1部門1,部門2 1 oracle中使用wm concat 或listagg 函式,注意最好要加上t...
SQL 字串連線聚合函式
mysql 直接呼叫函式group concat完成 oracle10g 直接掉函式wm concat完成 oracle9i 麻煩點,不過主要是通過sys connect by path,這個函式能樹枝進行按指定字元連線,之所以產生樹是因為這裡面用到了oracle的start with 遞迴成樹的 ...