将来自查询的多行结果连接到具有可扩展值的1列中

时间:2019-07-15 13:52:43

标签: sql sql-server sql-server-2014

我试图找出如何使用可伸缩值将多个行组合成基于唯一ID的逗号分隔列。

我有db.master的这2个测试值1111、2222,但是这些值可能很多。

在此表中,它们每个都有多个不同的组ID

[Meterdb]。[dbo]。[组]

Serial groupId
1111    1
1111    2
1111    3
1111    4
2222    5
2222    6
2222    7
2222    8

这是我想要的结果

Serial  groups
1111    1,2,3,4
2222    5,6,7,8

我已经将它与单个值一起使用,但是一旦我插入多个值,它只会显示第一个结果。

我显然在代码中存在缺陷,也许在结构本身中也存在缺陷,但是我一直无法弄清楚如何使它能够工作于可伸缩值。

要获得逗号分隔的结果,我一直在使用STUFF函数。

因此,我实际上试图实现的是如何正确获取stuff命令,以便仅将=的值返回给要搜索的序列。

如果我没有将声明的值插入stuff命令中,它将仅返回不与序列列相关联的group列中的所有值。 我也尝试过将STUFF函数作为子查询加入,但是结果相同。

DECLARE @tempD TABLE  (list VARCHAR(25))
insert into @tempD
values ('1111') ,('2222')

Select serial, groups =  

( STUFF (( SELECT ',' +convert (varchar(30),GroupId) 

from master md  
left outer join [Meterdb].[dbo].[Group] rg on md.serial = rg.[serial] 

WHERE serial in ( select list from @tempD )
FOR XML PATH ('')) ,1 ,1, ''))
from  master
WHERE serial in ( select list from @tempD)

我除外

serial  groups
1111    1,2,3,4
2222    5,6,7,8

结果:

serial  groups
1111    1,2,3,4 

如何获取仅将=组返回序列的函数,以便可以插入多个变量。

1 个答案:

答案 0 :(得分:0)

可能更像这样(显然未经测试)

DECLARE @tempD TABLE  (list VARCHAR(25));
INSERT INTOl @tempD   values ('1111') ,('2222');

SELECT      serial, 
            STUFF (G.Groups,1,1,SPACE(0))                       AS groups
FROM        master                                              AS MD
OUTER APPLY(SELECT( SELECT ',' +CONVERT(VARCHAR(30),GroupId) 
                    FROM   [Meterdb].[dbo].[Group]              AS rg 
                    WHERE  md.serial = rg.[serial]
                    FOR XML PATH(''), TYPE
                  ).value ('text()[1]','varchar(max)')
            )                                                   AS G(groups)
WHERE       MD.serial IN ( SELECT list FROM @tempD)