2011-11-04 193 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