SQL Server: объединение нескольких строк в одну строку
У меня есть такой SQL-запрос;
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
как я могу это сделать?
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 соответственно, вы увеличьте его до более высокого значения по мере необходимости.
Comments