SQL Server: łączenie wielu wierszy w jeden wiersz

Mam takie zapytanie SQL;

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

I to są Wyniki;

Tutaj wpisz opis obrazka

To czego chcę to; Pokazywanie w jednym wierszu (komórce) połączone wszystkie STRINGVALUE's i są oddzielone przecinkiem. Like this;

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
Jak mogę to zrobić?
Author: Soner Gönül, 2011-11-04

5 answers

Istnieje kilka metod.

Jeśli chcesz zwrócić tylko skonsolidowaną wartość ciągu, jest to dobre szybkie i łatwe podejście

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

SELECT @combinedString as StringValue 

Który zwróci Twój połączony ciąg.

Możesz również wypróbować jedną z metod XML, np.

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
 71
Author: Code Magician,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-16 10:37:25

Można osiągnąć to jest połączyć dla ścieżki XML i rzeczy w następujący sposób:

SELECT (STUFF((
        SELECT ', ' + StringValue
        FROM Jira.customfieldvalue
        WHERE CUSTOMFIELD = 12534
        AND ISSUE = 19602
        FOR XML PATH('')
        ), 1, 2, '')
    ) AS StringValue
 15
Author: Karthikeyan P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-16 10:35:03

Istnieje do tego wygodna metoda w MySql o nazwie GROUP_CONCAT. Odpowiednik dla SQL Server nie istnieje, ale możesz napisać swój własny używając sqlclr. Na szczęście ktoś już to za ciebie zrobił.

Twoje zapytanie zamienia się w to (co btw jest o wiele ładniejszą składnią):

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

Ale proszę pamiętać, że ta metoda jest dobra dla co najwyżej 100 wierszy w grupie . Poza tym będziesz miał poważne problemy z wydajnością. Agregaty SQLCLR muszą serializować dowolne wyniki pośrednie i to szybko gromadzi się do dość dużo pracy. Pamiętaj o tym!

Co ciekawe FOR XML nie cierpi na ten sam problem, ale zamiast tego używa tej strasznej składni.

 9
Author: John Leidegren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-05 21:19:41

Użycie wbudowanej funkcji MySQL group_concat() będzie dobrym wyborem dla uzyskania pożądanego rezultatu. Składnia będzie -

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

Przed wykonaniem powyższego polecenia upewnij się, że zwiększyłeś Rozmiar group_concat_max_len w przeciwnym razie całe wyjście może nie zmieścić się w tej komórce.

Aby ustawić wartość group_concat_max_len, wykonaj poniższe polecenie -

SET group_concat_max_len = 50000;

Możesz odpowiednio zmienić wartość 50000, zwiększasz ją do wyższej wartości jako wymagane.

 1
Author: Rito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-01 13:11:40

Wierzę w bazy danych, które wspierają listagg funkcja, którą można wykonać:

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
 1
Author: Liang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-27 18:02:37