一个业务场景,客户下了1个订单,出货的时候1个订单分了多次出货,出货单号存于表A,订单号数据存于表B,表A存有表B的ddid用于关联,统计报表要显示订单号对应的多次出货单,数据如下:
表A | 表B ddid |
出货号 | 订单号 |
PL001 | SC001 |
PL002 | SC001 |
PL003 | SC001 |
PL004 | SC002 |
PL005 | SC002 |
PL006 | SC002 |
要显示的结果如下:
订单号 | 对应的出货单号 |
SC001 | PL001、PL002、PL003 |
SC002 | PL004、PL005、PL006 |
报表需要多个订单号要在一个字段中,之前在网上查到使用stuff + for xml path的形式拼接字段,如下
select B.订单号,对应的出货单号 = stuff((select ',',isnull(A.出货单号,'')
from A where A.ddid = B.ddid for xml path('')) ,1,1,'')
from B
但是使用这个有个问题是,数据量小的时候还可以,数据量大的时候会变卡,影响性能,所以决定使用标量值函数
USE [你的数据库名]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
create function [dbo].[你的标量值函数名](@传入参数名 As Varchar(40))
Returns Varchar(500)
As
BEGIN
Declare @s As Varchar(500)
Set @s=''
Begin
select @s=@s+'、'+ISNULL(C.出货单号,'') From
(Select A.出货单号 From A Where A.ddid = @传入参数名 ) C
END
Return Stuff(@s,1,1,'')
End
调用标量值函数
select B.订单号,对应的出货单号 = dbo.创建的函数('ddid')
from B