La concatenazione di valori in base a ID

Ho una tabella chiamata Risultati e i dati aspetto:

Response_ID    Label
12147          It was not clear
12458          Did not Undersstand
12458          Was not resolved
12458          Did not communicate
12586          Spoke too fast
12587          Too slow

Ora voglio l’output per visualizzare una riga per ogni ID e i valori di Etichetta per essere concatenati e separati da virgola

Mio Output dovrebbe essere simile:

Response_ID    Label
12147          It was not clear
12458          Did not Undersstand,Was not resolved,Did not communicate
12586          Spoke too fast
12587          Too Slow

Come posso fare questo:

OriginaleL’autore | 2011-07-06

4 Replies
  1. 10

    Non si può essere sicuri circa l’ordine delle stringhe concatenate senza un’istruzione order by nella query di sub. Il .value('.', 'varchar(max)') parte c’è da gestire il caso in cui Label contiene XML-ostili personaggi come &.

    declare @T table(Response_ID int, Label varchar(50))
    insert into @T values
    (12147,          'It was not clear'),
    (12458,          'Did not Undersstand'),
    (12458,          'Was not resolved'),
    (12458,          'Did not communicate'),
    (12586,          'Spoke too fast'),
    (12587,          'Too slow')
    
    select T1.Response_ID,
           stuff((select ','+T2.Label
                  from @T as T2
                  where T1.Response_ID = T2.Response_ID
                  for xml path(''), type).value('.', 'varchar(max)'), 1, 1, '') as Label
    from @T as T1
    group by T1.Response_ID
    Buon punto circa .valore, cerco sempre di fare ipotesi circa i dati in questione, ampiamente rappresentativo. Esso non causa un errore, naturalmente, visualizza solo le entità (ad esempio, &). Tuttavia io non sono così sicuro ordine è stato importante per l’OP – e in quale ordine da aggiungere, se così non fosse? Avremmo bisogno di più informazioni.
    Sì, abbiamo bisogno di più informazioni su ordine. Stavo solo facendo un punto a @Sam che, anche se questo codice di esempio concatena la stringa nell’ordine previsto, non vi è alcuna garanzia che farà in modo che ogni volta.
    Grazie Mille!
    Questa non è una buona soluzione, perché si tratta di un problema di prestazioni quando ci sono il numero di righe nella tabella. Funzioni XML sono lenti.

    OriginaleL’autore Mikael Eriksson

  2. 1
    DECLARE @Results TABLE(Response_ID INT, Label VARCHAR(80));
    
    INSERT @Results(Response_ID, Label)
    SELECT 12147,'It was not clear'
    UNION SELECT 12458,'Did not Undersstand'
    UNION SELECT 12458,'Was not resolved'
    UNION SELECT 12458,'Did not communicate'
    UNION SELECT 12586,'Spoke too fast'
    UNION SELECT 12587,'Too slow';
    
    WITH x AS 
    (
      SELECT Response_ID FROM @Results 
      GROUP BY Response_ID
    )
    SELECT x.Response_ID, Label = STUFF((SELECT ',' + Label
        FROM @Results WHERE Response_ID = x.Response_ID
        FOR XML PATH('')), 1, 1, '')
        FROM x;

    OriginaleL’autore Aaron Bertrand

  3. -1

    Considerare questo, è molto performante:

    http://jerrytech.blogspot.com/2010/04/tsql-concatenate-strings-1-2-3-and.html

    Evitare XML funzioni perché non sono performanti.

    Questo richiederà un certo sforzo per implementare, ma milioni di righe => millisecondi per l’esecuzione.

    -Preferenza a “considerare questa” risposta? Vergognoso.
    Io non downvote si, ma l’ho fatto vedere qualche discussione circa le prestazioni di un CTE ricorsiva vs XML qui: stackoverflow.com/questions/13639262/… sembra che Per XML è più veloce su dataset di grandi dimensioni.

    OriginaleL’autore Jerry Nixon – MSFT

Lascia un commento