SQL字串的分組聚合 ZT

2022-01-12 19:58:57 字數 3473 閱讀 2580

本文**於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 遞迴成樹的 ...