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; 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?
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
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
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.
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
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.
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