SQL Server: combinaison de plusieurs lignes en une seule ligne
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;
Ce que je veux, c'est; montrer dans une ligne (cellule) combiné 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?
5 réponses
Il existe plusieurs méthodes.
Si vous voulez juste la valeur de chaîne consolidée retournée, c'est une bonne approche rapide et facile
DECLARE @combinedString VARCHAR(MAX)
SELECT @combinedString = COALESCE(@combinedString + ', ', '') + stringvalue
FROM jira.customfieldValue
WHERE customfield = 12534
AND ISSUE = 19602
SELECT @combinedString as StringValue
Qui renverra 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
Vous pouvez réaliser ceci est de combiner pour le chemin XML et les choses comme suit:
SELECT (STUFF((
SELECT ', ' + StringValue
FROM Jira.customfieldvalue
WHERE CUSTOMFIELD = 12534
AND ISSUE = 19602
FOR XML PATH('')
), 1, 2, '')
) AS StringValue
Il existe une méthode pratique pour cela dans MySql appelée GROUP_CONCAT. Un équivalent pour SQL Server n'existe pas, mais vous pouvez écrire le vôtre en utilisant le SQLCLR. Heureusement quelqu'un déjà fait pour vous.
Votre requête se transforme alors en ceci (qui btw est 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
Mais veuillez noter que cette méthode est bonne pour au plus 100 lignes dans un groupe . Au-delà de cela, vous aurez des problèmes de performance majeurs. Les agrégats SQLCLR doivent sérialiser tout des résultats intermédiaires et qui accumulent rapidement beaucoup de travail. Gardez cela à l'esprit!
Fait intéressant, le FOR XML
ne souffre pas du même problème mais utilise plutôt cette syntaxe horrible.
L'utilisation de la fonction intégrée 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 sortie entière peut 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, vous l'augmentez à une valeur plus élevée comme requis.
Je crois pour les bases de données qui prennent en charge listagg fonction, 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