web-dev-qa-db-fra.com

SQL Server: combinaison de plusieurs lignes en une seule

J'ai une requête SQL comme celle-ci;

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

Et ce sont les résultats;

enter image description here

Ce que je veux c'est; montrant dans une ligne (cellule) combinés tous les STRINGVALUE 'et ils sont séparés par une virgule. Comme ça;

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

Comment puis je faire ça?

58
Soner Gönül

Il y a plusieurs méthodes.

Si vous souhaitez uniquement renvoyer la valeur de la chaîne consolidée, il s'agit d'une bonne approche rapide et simple.

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

SELECT @combinedString as StringValue 

Ce qui retournera votre chaîne combinée.

Vous pouvez également essayer l’une des méthodes XML, par exemple:.

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
76
Code Magician

Vous pouvez y parvenir en combinant For XML Path et STUFF comme suit:

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

Il existe une méthode pratique pour cela dans MySql appelée GROUP_CONCAT. Il n’existe pas d’équivalent pour SQL Server, mais vous pouvez écrire le vôtre à l’aide de SQLCLR. Heureusement quelqu'un l'a déjà fait pour vous.

Votre requête se transforme alors en ceci (ce qui est d'ailleurs une syntaxe beaucoup plus agréable):

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

Notez cependant que cette méthode convient au maximum à 100 lignes dans un groupe . Au-delà de cela, vous aurez de gros problèmes de performances. Les agrégats SQLCLR doivent sérialiser tous les résultats intermédiaires, ce qui entraîne rapidement beaucoup de travail. Garde ça en tête!

Il est intéressant de noter que le FOR XML ne souffre pas du même problème mais utilise cette syntaxe horrible.

9
John Leidegren

Je crois que pour les bases de données qui supportent listagg , vous pouvez faire:

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
Liang

Utiliser la fonction intégrée de MySQL group_concat () sera un bon choix pour obtenir le résultat souhaité. La syntaxe sera -

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

Avant d’exécuter la commande ci-dessus, assurez-vous d’augmenter la taille de group_concat_max_len sinon la totalité de la sortie risque de ne pas tenir dans cette cellule.

Pour définir la valeur de group_concat_max_len, exécutez la commande ci-dessous.

SET group_concat_max_len = 50000;

Vous pouvez modifier la valeur 50000 en conséquence, augmentez-la si nécessaire.

0
Rito
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
mehrab habibi