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

方法一:自定义函数

定义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('')

 

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

SQL Server中,如果要拆分多行数据,可以使用多种方法,以下是其中几种常用的方法: 1. 递归CTE(公共表达式):使用递归CTE可以将多行数据逐行拆分单行,并将其放入一个新的数据中。具体步骤如下: - 创建递归CTE,将原始表作为初始查询结果。 - 在递归查询中使用UNION ALL将每一行划分两个部分,一部分是当前行的某个拆分,另一部分是剩余行的拆分结果。 - 逐步递归,直到没有剩余行为止。 - 使用组合窗口函数(如STRING_AGG)将递归CTE的拆分合并一个字符串。 2. 使用自定义函数:可以编写自定义函数来拆分多行数据。函数的输入参数为多行数据,输出参数为拆分后的单行数据。具体步骤如下: - 创建一个函数,接受多行数据作为参数。 - 在函数内部,使用循环结构(如WHILE)逐行读取输入数据,并将其拆分单行。 - 使用临时表或表变量保存单行数据。 - 循环结束后,将临时表或表变量中的数据合并一个字符串。 3. 使用XML PATH方法:利用SQL Server中的FOR XML PATH语句可以将多行数据拼接XML格式,并将其合并为一个字符串。具体步骤如下: - 使用SELECT语句查询出多行数据,并使用FOR XML PATH语句将其转换为XML格式。 - 使用XML格式的数据进行拆分,将其拼接一个字符串。 总之,SQL Server中可以使用递归CTE、自定义函数或XML PATH方法来拆分多行数据。具体选择哪种方法取决于具体的需求和数据结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值