SQL Server:将多行组合成一行

我有这样的SQL查询;

SELECT * FROM Jira.customfieldvalue WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602 

这就是结果;

在这里输入图像说明

我想要的是 显示在一行(单元格)合并所有STRINGVALUE的和他们用逗号分隔。 喜欢这个;

 SELECT --some process with STRINGVALUE-- FROM Jira.customfieldvalue WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602 Araç Listesi (C2, K1 vb.Belgeler; yoksa Ruhsat Fotokopileri), Min. 5 araç plakası için İnternet Sorgusu, Son 3 Yıla Ait Onaylı Yıl Sonu Bilanço + Gelir Tablosu, Son Yıl (Yıl Sonuna ait) Detay Mizanı, İçinde Bulunduğumuz Yıla ait Ara Dönem Geçici Vergi Beyannamesi, Bayi Yorum E-Maili, Proforma Fatura 

我怎样才能做到这一点?

有几种方法。

如果您只想返回整合的string值,这是一个快速而简单的方法

 DECLARE @combinedString VARCHAR(MAX) SELECT @combinedString = COALESCE(@combinedString + ', ', '') + stringvalue FROM jira.customfieldValue WHERE customfield = 12534 AND ISSUE = 19602 SELECT @combinedString as StringValue 

哪个会返回你的组合string。

您也可以尝试其中一种XML方法,例如

 SELECT DISTINCT Issue, Customfield, StringValues FROM Jira.customfieldvalue v1 CROSS APPLY ( SELECT StringValues + ',' FROM jira.customfieldvalue v2 WHERE v2.Customfield = v1.Customfield AND v2.Issue = v1.issue ORDER BY ID FOR XML PATH('') ) D ( StringValues ) WHERE customfield = 12534 AND ISSUE = 19602 

你可以做到这一点,就是把XML Path和STUFF结合起来,如下所示:

 SELECT (STUFF(( SELECT ', ' + StringValue FROM Jira.customfieldvalue WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602 FOR XML PATH('') ), 1, 2, '') ) AS StringValue 

在MySql中有一个方便的方法叫做GROUP_CONCAT。 SQL Server的等价物不存在,但可以使用SQLCLR编写自己的。 幸运的是有人已经为你做了。

你的查询然后变成这个(这btw是一个更好的语法):

 SELECT CUSTOMFIELD, ISSUE, dbo.GROUP_CONCAT(STRINGVALUE) FROM Jira.customfieldvalue WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602 GROUP BY CUSTOMFIELD, ISSUE 

但请注意, 这种方法适用于一个组中最多100行 。 除此之外,你将会遇到重大的性能问题。 SQLCLR聚合必须序列化任何中间结果,并迅速堆积到相当多的工作。 记住这一点!

有趣的是, FOR XML不会遇到同样的问题,而是使用那个可怕的语法。

使用MySQL内置函数group_concat()将是获得所需结果的好select。 语法将是 –

 SELECT group_concat(STRINGVALUE) FROM Jira.customfieldvalue WHERE CUSTOMFIELD = 12534 AND ISSUE = 19602 

在执行上述命令之前,请确保增加了group_concat_max_len的大小,否则整个输出可能不适合该单元格。

要设置group_concat_max_len的值,请执行以下命令 –

 SET group_concat_max_len = 50000; 

您可以相应地更改值50000,根据需要将其增加到更高的值。

我相信对于支持listagg函数的数据库,你可以这样做:

 select id, issue, customfield, parentkey, listagg(stingvalue, ',') within group (order by id) from jira.customfieldvalue where customfield = 12534 and issue = 19602 group by id, issue, customfield, parentkey