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