Domanda

    

Questa domanda ha già una risposta qui:

         

Se ho una tabella come questa:

+------------+
| Id | Value |
+------------+
| 1  | 'A'   |
|------------|
| 1  | 'B'   |
|------------|
| 2  | 'C'   |
+------------+

Come posso ottenere un gruppo di risultati come questo:

+------------+
| Id | Value |
+------------+
| 1  | 'AB'  |
|------------|
| 2  | 'C'   |
+------------+

So che questo è davvero facile da fare in MySQL utilizzando group_concat, ma ho bisogno di essere in grado di farlo in MSSQL 2005

Grazie

(Duplicate di Come utilizzare GROUP BY per concatenare stringhe in SQL Server? )

È stato utile?

Soluzione

Per una soluzione pulita ed efficiente è possibile creare un utente funzione di aggregazione definita , c'è anche un esempio che fa proprio quello che bisogno.
È quindi possibile utilizzare come qualsiasi altra funzione di aggregazione (con un piano di query standard):

piano di query

Altri suggerimenti

Questo farà:

SELECT mt.ID,
       SUBSTRING((SELECT mt2.Value
                  FROM   MyTable AS mt2
                  WHERE  mt2.ID = mt.ID
                  ORDER BY mt2.VALUE
                  FOR XML PATH('')), 3, 2000) AS JoinedValue
FROM   MyTable AS mt

Spesso chiese qui .

Il modo più efficace sta usando il FOR XML PATH trucco.

Questo solo è venuto da me come una possibile soluzione. Non ho idea di come per le prestazioni, ma ho pensato che sarebbe stato un modo interessante per risolvere il problema. Ho provato che funziona in una situazione semplice (non ho il codice per tenere conto di NULL). Sentitevi liberi di dare una prova per vedere se si comporta bene per voi.

La tabella che ho usato comprendeva un id (my_id). Questo potrebbe davvero essere una colonna che è univoco all'interno del gruppo (grp_id), quindi potrebbe essere una colonna di data o qualsiasi altra cosa.

;WITH CTE AS (
    SELECT
        T1.my_id,
        T1.grp_id,
        CAST(T1.my_str AS VARCHAR) AS my_str
    FROM
        dbo.Test_Group_Concat T1
    WHERE NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T2 WHERE T2.grp_id = T1.grp_id AND T2.my_id < T1.my_id)
    UNION ALL
    SELECT
        T3.my_id,
        T3.grp_id,
        CAST(CTE.my_str + T3.my_str AS VARCHAR)
    FROM
        CTE
    INNER JOIN dbo.Test_Group_Concat T3 ON
        T3.grp_id = CTE.grp_id AND
        T3.my_id > CTE.my_id
    WHERE
        NOT EXISTS (SELECT * FROM dbo.Test_Group_Concat T4 WHERE
        T4.grp_id = CTE.grp_id AND
        T4.my_id > CTE.my_id AND
        T4.my_id < T3.my_id)
)
SELECT
    CTE.grp_id,
    CTE.my_str
FROM
    CTE
INNER JOIN (SELECT grp_id, MAX(my_id) AS my_id FROM CTE GROUP BY grp_id) SQ ON
    SQ.grp_id = CTE.grp_id AND
    SQ.my_id = CTE.my_id
ORDER BY
    CTE.grp_id
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top