2011-11-04 9 views
46

Ho una query SQL come questa;SQL Server: combinazione di più righe in una riga

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

E questo è il risultato;

enter image description here

Quello che voglio è; mostrando in una riga (cella) combinato tutti gli STRINGVALUE e sono separati da una virgola. Come questo;

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 

Come posso fare?

+0

aka come violare 1NF cioè questo non è facile da fare in SQL (un odore) in base alla progettazione perché si tratta di generare un risultato non relazionale. Invece farlo in uno strumento di segnalazione, codice di front-end, ecc. – onedaywhen

risposta

65

Esistono diversi metodi.

Se si desidera solo il valore della stringa consolidato restituito, questo è un buon approccio semplice e veloce

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

SELECT @combinedString as StringValue 

che restituirà la stringa combinato.

Puoi anche provare uno dei metodi XML, ad es.

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 
9

C'è un metodo conveniente per questo in MySql chiamato GROUP_CONCAT. Un equivalente per SQL Server non esiste, ma è possibile scrivere il proprio utilizzando SQLCLR. Fortunatamente lo someone l'ha già fatto per te.

Vostri criteri si trasforma poi in questo (che btw è una sintassi molto più bello):

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

Ma vi prego di notare che questo metodo è un bene per al massimo 100 righe all'interno di un gruppo. Oltre a ciò, avrai grossi problemi di prestazioni. Gli aggregati SQLCLR devono serializzare qualsiasi risultato intermedio e questo accumula rapidamente un bel po 'di lavoro. Tienilo a mente!

È interessante notare che lo FOR XML non presenta lo stesso problema ma utilizza quella sintassi orrenda.

+0

Ho una situazione in cui questo raggrupperà solo due o tre righe al massimo, quindi questo è perfetto per me nella sua semplicità. Visto che questa risposta ha qualche anno, le prestazioni di questo metodo sono migliorate? – Christian

12

È possibile raggiungere questo obiettivo è quello di combinare Per XML Path e roba come segue:

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

Utilizzando MySQL funzione intrinseca group_concat() sarà una buona scelta per ottenere il risultato desiderato. La sintassi sarà -

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

Prima di eseguire il comando precedente assicuratevi di aumentare la dimensione del group_concat_max_len altrimenti il ​​tutto in uscita potrebbe non essere contenuto in quella cella.

per impostare il valore di group_concat_max_len, eseguire il sotto Comando

SET group_concat_max_len = 50000; 

È possibile modificare il valore di conseguenza 50000, si aumenta ad un valore più alto, come richiesto.

+0

Grazie, ma mi dispiace, la mia domanda era per "T-SQL" come puoi vedere. La tua risposta è stata _also_ inclusa in [Combina più righe figlio in una riga MYSQL] (http://stackoverflow.com/q/1067428/447156). –

1

Credo per i database che supportano listagg funzione, è possibile fare:

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 
Problemi correlati