2011-11-04 150 views
46

我有这样的SQL查询;SQL Server:将多行组合成一行

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

而这就是结果;

enter image description here

我要的是;显示在一行(单元格)合并的所有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 

我该怎么做?

+0

又名如何违背1NF即这并不容易,因为它涉及到设计在SQL(异味)做生成非关系结果。而是在报告工具,前端代码等中做到这一点。 – onedaywhen

回答

65

有几种方法。

如果你只想合并字符串返回值,这是一个很好的快速简便的方法

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 
9

在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不会遭受同样的问题,而是使用那种可怕的语法。

+0

我有一种情况,这将只在最多两组或三组,所以这对我来说很简单。看到这个答案是几年前,这种方法的性能有所提高? – Christian

12

你可以做到这一点是结合对XML路径和东西如下:

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

使用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,你把它提高到一个更高的价值要求。

+0

谢谢,但很抱歉,我的问题是“T-SQL”,你可以看到。顺便说一句,您的答案也包含在[将多个子行组合成一行MYSQL](http://stackoverflow.com/q/1067428/447156)中。 –

1

相信对于支持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