需求:按照分組,將多條記錄內容合併成一條,效果如下:
資料庫示例:
create根據不同的sql版本,可以有以下方法: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 2000 不支援for xml,不支援concat。只能寫自定義函式。
create二、sql 2012 支援 concat,2000版本自定義函式的基礎上可少量優化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
--三、sql2005支援for xml,可以大量簡化將2000版中的
select
@str
=@str+'
,'+ town from t2 where district=
@district
--變成
select
@str
= concat(@str,'
,',town) from t2 where district=
@district
其他**不變
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...