SQL Server: объединение нескольких строк в одну строку - PullRequest
57 голосов
/ 04 ноября 2011

У меня есть такой запрос 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

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

Ответы [ 6 ]

75 голосов
/ 04 ноября 2011

Есть несколько методов.

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

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
16 голосов
/ 16 июля 2015

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

SELECT (STUFF((
        SELECT ', ' + StringValue
        FROM Jira.customfieldvalue
        WHERE CUSTOMFIELD = 12534
        AND ISSUE = 19602
        FOR XML PATH('')
        ), 1, 2, '')
    ) AS StringValue
9 голосов
/ 04 ноября 2011

Для этого в 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

Но обратите внимание, что1008 * этот метод подходит максимум для 100 строк в группе .Помимо этого у вас будут серьезные проблемы с производительностью.Агрегаты SQLCLR должны сериализовать любые промежуточные результаты, и это быстро накапливает довольно много работы.Имейте это в виду!

Интересно, что FOR XML не страдает от той же проблемы, но вместо этого использует этот ужасающий синтаксис.

1 голос
/ 27 октября 2017

Я считаю, что для баз данных, которые поддерживают 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
0 голосов
/ 17 апреля 2019
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
0 голосов
/ 01 августа 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...