Dav*_*ein 1 t-sql sql-server-2000
我有以下脚本:
SELECT left(SHI.FSOKEY, 6) AS [SoNo]
, substring(SHI.FSOKEY, 7, 3) AS [So Item]
, right(SHI.FSOKEY, 3) AS [So Rels]
, QAL.FCLOT AS [LotSerial]
FROM shmast SHM
INNER JOIN shitem SHI
ON SHM.FSHIPNO = SHI.FSHIPNO
INNER JOIN qalotc QAL
ON SHM.FSHIPNO = Left(QAL.FCUSEINDOC, 6)
AND substring(QAL.FCUSEINDOC, 7, 6) = SHI.FITEMNO
Run Code Online (Sandbox Code Playgroud)
这会产生如下所示的输出:
SoNo So Item SoRels LotSerial
123456 1 001 ABCD
123456 1 001 AMOH
123456 1 001 POWK
123456 1 001 IUIL
123456 1 002 ABCE
Run Code Online (Sandbox Code Playgroud)
我想按SoNo,SoItem,SoRels分组并获得每个LotSerial的列表.所以,我的输出看起来像这样:
SoNo So Item SoRels LotSerial
123456 1 001 ABCD, AMOH, POWK, IUIL
123456 1 002 ABCE
Run Code Online (Sandbox Code Playgroud)
我需要这样做,我可以将此信息提取回基于SoNo,SoItem,SoRels的主查询.
任何帮助将不胜感激.
一如既往,尽可能避免使用游标.您的场景非常适合用户定义的功能.我为这个例子简化了你的模式.本质上,我们将与逗号匹配的序列连接到用户定义函数中的变量,然后重新调整结果.如果可以使用Null值,则可能需要添加Coalesce的使用
create table SO (SONO int)
insert into SO values (1)
insert into SO values (2)
insert into SO values (3)
create table SOCHILD
(SONO int, SerialNo varchar(10))
insert into SOCHILD values (1, 'ABCD')
insert into SOCHILD values (1, 'EFGH')
insert into SOCHILD values (1, 'IJKL')
GO
create function fx_GetSerials(@SONO int)
returns varchar(1000) as
Begin
Declare @ret varchar(1000)
set @ret = ''
Select @ret = @ret + SerialNo + ','
from SOCHILD where SONO = @SONO
if (len(@ret) > 0)
set @Ret = left(@ret, len(@ret) -1)
return @ret
End
GO
select dbo.Fx_GetSerials(1)
drop function fx_GetSerials
Drop table SO
Drop table SOCHILD
Run Code Online (Sandbox Code Playgroud)
结果ABCD,EFGH,IJKL