SQL Server: объединение нескольких строк в одну строку



У меня есть такой SQL-запрос;



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


как я могу это сделать?

605   5  

5 ответов:

Существует несколько методов.

Если вы хотите только консолидированное строковое значение возвращается, это хороший быстрый и легкий подход

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

вы можете добиться этого, чтобы объединить для XML путь и вещи следующим образом:

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. К счастью кто-то уже сделал это для вас.

ваш запрос затем превращается в это (что кстати является гораздо более приятным синтаксисом):

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 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

Comments

    Ничего не найдено.