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

338
48

У меня есть SQL-запрос, подобный этому:


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

И что результаты;


enter image description here


Чего я хочу; показывая в одной строке (ячейке) все STRINGVALUE, и они разделены запятой. Вот так:


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


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

спросил(а) 2021-01-19T19:29:54+03:00 6 месяцев назад
1
Решение
387

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


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


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

ответил(а) 2021-01-19T19:29:54+03:00 6 месяцев назад
184

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

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

ответил(а) 2021-01-19T19:29:54+03:00 6 месяцев назад
140

Для этого в 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 не страдает от той же проблемы, а использует этот ужасный синтаксис.

ответил(а) 2021-01-19T19:29:54+03:00 6 месяцев назад
65

Я считаю, что для баз данных, которые поддерживают 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

ответил(а) 2021-01-19T19:29:54+03:00 6 месяцев назад
45

CREATE VIEW  [dbo].[ret_vwSalariedForReport]
AS
WITH temp1 AS (SELECT
salaried.*,
operationalUnits.Title as OperationalUnitTitle
FROM
ret_vwSalaried salaried LEFT JOIN
prs_operationalUnitFeatures operationalUnitFeatures on salaried.[Guid] = operationalUnitFeatures.[FeatureGuid] LEFT JOIN
prs_operationalUnits operationalUnits ON operationalUnits.id = operationalUnitFeatures.OperationalUnitID
),
temp2 AS (SELECT
t2.*,
STUFF ((SELECT ' - ' + t1.OperationalUnitTitle
FROM
temp1 t1
WHERE t1.[ID] = t2.[ID]
For XML PATH('')), 2, 2, '') OperationalUnitTitles from temp1 t2)
SELECT
[Guid],
ID,
Title,
PersonnelNo,
FirstName,
LastName,
FullName,
Active,
SSN,
DeathDate,
SalariedType,
OperationalUnitTitles
FROM
temp2
GROUP BY
[Guid],
ID,
Title,
PersonnelNo,
FirstName,
LastName,
FullName,
Active,
SSN,
DeathDate,
SalariedType,
OperationalUnitTitles

ответил(а) 2021-01-19T19:29:54+03:00 6 месяцев назад
46

Использование встроенной функции 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 соответственно, вы увеличиваете его до более высокого значения по мере необходимости.

ответил(а) 2021-01-19T19:29:54+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема