牛骨文教育服务平台(让学习变的简单)
博文笔记

sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果

创建时间:2016-03-04 投稿人: 浏览次数:19065

方法一:自定义函数

定义Aggregate_BaseMateriel函数

GO
Create FUNCTION Aggregate_BaseMateriel(@ShipMentNo varchar(50)) 
RETURNS varchar(1024) 
AS 
BEGIN 
    declare @Str varchar(1024) 
    set @Str = "" 
    select @Str = @Str + " ◆ " + [BaseMateriel] from tb_SendShipMent_Detail 
    where [ShipMentNo] = @ShipMentNo
    return @Str 
END 
GO


然后就可以写sql语句查询了,通过按ShipMentNo分组查询,得到明细中BaseMateriel的拼接结果

select detail.ShipMentNo,dbo.AggregateBaseMateriel(ShipMentNo) as materielList 

from tb_SendShipMent_Detail detail 

where ShipMentNo = "XOUT20150928002"
group by detail.ShipMentNo

但是这种方法缺点是,如果多表查询,或者穿插在子查询里的话,查询速度会非常慢


--------------------------------------------------------------------------------------------------------------------------------------

方法二:使用stuff + for xml path

select  [value] = stuff((select "◆"+[BaseMateriel]  from tb_SendShipMent_Detail detail
where detail.ShipMentNo = "XOUT20150928002" for xml path("")), 1, 1, "")


其中stuff的作用是:删除指定长度的字符,并在指定的起点处插入另一组字符

语法:STUFF ( character_expression , start , length ,character_expression )

列:SELECT STUFF("abcdef", 2, 3, "ijklmn")

结果为:aijklmnef


FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现

select BaseMateriel from tb_SendShipMent_Detail 的结果为:



但是如果换成 :select BaseMateriel from tb_SendShipMent_Detail for xml path(""),结果为:



让我们来稍微改良一下,得到自己想要的拼接结果:

select  "◆" + BaseMateriel from tb_SendShipMent_Detail for xml path("")



方法二无论操作简易度和查询速度都是比方法一要好

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。