日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

SQL 列转行,即多行合并成一条

發(fā)布時(shí)間:2024/9/20 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SQL 列转行,即多行合并成一条 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

需求:按照分組,將多條記錄內(nèi)容合并成一條,效果如下:

數(shù)據(jù)庫示例:

CREATE TABLE [t2]([NID] [bigint] NULL,[district] [nvarchar](255) NULL,[town] [nvarchar](255) NULL); insert into t2 values(1,'淮上區(qū)','曹老集鎮(zhèn)'); insert into t2 values(2,'淮上區(qū)','淮濱街道'); insert into t2 values(3,'淮上區(qū)','梅橋鄉(xiāng)'); insert into t2 values(4,'淮上區(qū)','吳小街鎮(zhèn)'); insert into t2 values(5,'淮上區(qū)','小蚌埠鎮(zhèn)'); insert into t2 values(1,'光明新區(qū)','公明街道'); insert into t2 values(2,'光明新區(qū)','光明街道'); insert into t2 values(1,'吉利區(qū)','大慶路街道'); insert into t2 values(2,'吉利區(qū)','吉利鄉(xiāng)');

根據(jù)不同的SQL版本,可以有以下方法:

一、SQL 2000 不支持FOR XML,不支持CONCAT。只能寫自定義函數(shù)。

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 -- 調(diào)用函數(shù) SELECt district, town = dbo.townconcat(district) FROM t2 GROUP BY district drop function dbo.townconcat go

二、SQL 2012 支持 concat,2000版本自定義函數(shù)的基礎(chǔ)上可少量?jī)?yōu)化

--將2000版中的 SELECT @str = @str + ',' + town FROM t2 WHERE district=@district --變成 SELECT @str = concat(@str,',',town) FROM t2 WHERE district=@district 其他代碼不變


三、SQL2005支持for xml,可以大量簡(jiǎn)化

select distinct a.district, (SELECT town+','FROM t2 where district=a.district FOR XML PATH(''))as towns from t2 a

以上三種方法都可以實(shí)現(xiàn)同樣的效果。效果第一段的需求中的效果。

四、分析:
以上3種方法各有優(yōu)劣,個(gè)人喜歡for xml的方式,因?yàn)閴蚝?jiǎn)單,一條select解決,可以直接適用于各視圖中。

核心的代碼是:

SELECT town+','FROM t2 FOR XML PATH('')

上面的代碼得到的結(jié)果為:

注:
1、上圖中的列名是自動(dòng)生成的,不可以通過as 來命名。
2、我們不可以select多列,比如SELECT district,town+',' as tt FROM t2? FOR XML PATH('')。

如果加上,并不會(huì)報(bào)錯(cuò),但效果可能不是我們想要的,如下圖:

那我們?nèi)绾胃鶕?jù)關(guān)鍵字段來分組呢,我們可以把(select ..FOR XML..)作為子查詢生成字段,看下圖:

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

總結(jié)

以上是生活随笔為你收集整理的SQL 列转行,即多行合并成一条的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。