SQL 列轉行,即多行合併成一條

2022-07-17 21:42:17 字數 2727 閱讀 8059

需求:按照分組,將多條記錄內容合併成一條,效果如下:

資料庫示例:

create

table[t2

]([nid][

bigint

]null,[

district][

nvarchar

](255) null,[

town][

nvarchar

](255) null

);insert

into t2 values(1,'

淮上區','

曹老集鎮');

insert

into t2 values(2,'

淮上區','

淮濱街道');

insert

into t2 values(3,'

淮上區','

梅橋鄉'

);insert

into t2 values(4,'

淮上區','

吳小街鎮');

insert

into t2 values(5,'

淮上區','

小蚌埠鎮');

insert

into t2 values(1,'

光明新區

','公明街道');

insert

into t2 values(2,'

光明新區

','光明街道');

insert

into t2 values(1,'

吉利區','

大慶路街道');

insert

into t2 values(2,'

吉利區','

吉利鄉');

根據不同的sql版本,可以有以下方法:

一、sql 2000 不支援for xml,不支援concat。只能寫自定義函式。

create

function dbo.townconcat(@district

nvarchar(255

)) returns

varchar(8000

) as

begin

declare

@str

varchar(8000

)

set@str=''

select

@str

=@str+'

,'+ town from t2 where district=

@district

return

stuff(@str, 1, 1, ''

) end

go--

呼叫函式

select district, town = dbo.townconcat(district) from t2 group

bydistrict

drop

function

dbo.townconcat

go

二、sql 2012 支援 concat,2000版本自定義函式的基礎上可少量優化

--

將2000版中的

select

@str

=@str+'

,'+ town from t2 where district=

@district

--變成

select

@str

= concat(@str,'

,',town) from t2 where district=

@district

其他**不變

三、sql2005支援for xml,可以大量簡化

select

distinct

a.district,

(select town+',

'from t2 where district=a.district for xml path(''))as

towns

from t2 a

以上三種方法都可以實現同樣的效果。效果第一段的需求中的效果。核心的**是:

select town+',

'from t2 for xml path('')

上面的**得到的結果為:

注:1、上圖中的列名是自動生成的,不可以通過as 來命名。

2、我們不可以select多列,比如select district,town+',' as tt from t2  for xml path('')。

如果加上,並不會報錯,但效果可能不是我們想要的,如下圖:

那我們如何根據關鍵字段來分組呢,我們可以把(select ..for xml..)作為子查詢生成字段,看下圖:

得到上圖就明白了吧,直接用distinct就可以了,見三。

SQL查詢多行合併成一行

問題描述 無論是在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...

sql 列轉行(將一條記錄(橫向)轉為一列顯示)

sql 列轉行 將一條查詢結果,本開始橫向的一條記錄,想讓他顯示為一列,此處查詢了130項因子資料,sql語句看著嚇人,只看一兩行就ok 轉換結果 sql語句 select b.c1 as climate value from climate index b where tm 195101 unio...

mssql FOR XML方法多行合併為一條資料

實驗室表 laboratoryroom 標籤表 tag 關係表 lab tag select lab.name,stuff select isnull tagname,from tagwhere id in select tagid from lab tag where labid lab.id f...