SQL Server:将多行组合成一行
我有这样的SQL查询;SQL Server:将多行组合成一行
SELECT *
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602
而这就是结果;
我要的是;显示在一行(单元格)合并的所有STRINGVALUE
's和他们用逗号分隔。喜欢这个;
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
我该怎么做?
有几种方法。
如果你只想合并字符串返回值,这是一个很好的快速简便的方法
DECLARE @combinedString VARCHAR(MAX)
SELECT @combinedString = COALESCE(@combinedString + ', ', '') + stringvalue
FROM jira.customfieldValue
WHERE customfield = 12534
AND ISSUE = 19602
SELECT @combinedString as StringValue
将返回合并后的字符串。
您还可以尝试其中一种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
在MySql中有一个方便的方法叫做GROUP_CONCAT。 SQL Server的等效项不存在,但可以使用SQLCLR编写自己的项目。幸运的是someone已经为你做了。
您的查询,然后变成这样(这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
不会遭受同样的问题,而是使用那种可怕的语法。
我有一种情况,这将只在最多两组或三组,所以这对我来说很简单。看到这个答案是几年前,这种方法的性能有所提高? – Christian
你可以做到这一点是结合对XML路径和东西如下:
SELECT (STUFF((
SELECT ', ' + StringValue
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602
FOR XML PATH('')
), 1, 2, '')
) AS StringValue
使用MySQL内置的功能GROUP_CONCAT()将是获得期望的结果是不错的选择。语法将是 -
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,你把它提高到一个更高的价值要求。
谢谢,但很抱歉,我的问题是“T-SQL”,你可以看到。顺便说一句,您的答案也包含在[将多个子行组合成一行MYSQL](http://*.com/q/1067428/447156)中。 –
相信对于支持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
又名如何违背1NF即这并不容易,因为它涉及到设计在SQL(异味)做生成非关系结果。而是在报告工具,前端代码等中做到这一点。 – onedaywhen