2010-07-30 12 views
17

Estoy seguro de que esto se ha preguntado, pero no puedo encontrar los términos de búsqueda correctos.Agregación de cadenas agrupadas/LISTAGG para SQL Server

dado un esquema como éste:

| CarMakeID | CarMake 
------------------------ 
|   1 | SuperCars 
|   2 | MehCars 

| CarMakeID | CarModelID | CarModel 
----------------------------------------- 
|   1 |   1 | Zoom 
|   2 |   1 | Wow 
|   3 |   1 | Awesome 
|   4 |   2 | Mediocrity 
|   5 |   2 | YoureSettling 

quiero producir un conjunto de datos de esta manera:

| CarMakeID | CarMake | CarModels 
--------------------------------------------- 
|   1 | SuperCars | Zoom, Wow, Awesome 
|   2 | MehCars | Mediocrity, YoureSettling 

¿Qué hago en lugar de 'AGG' para cuerdas en SQL Server en el siguiente consulta de estilo?

SELECT *, 
(SELECT AGG(CarModel) 
    FROM CarModels model 
    WHERE model.CarMakeID = make.CarMakeID 
    GROUP BY make.CarMakeID) as CarMakes 
FROM CarMakes make 

Respuesta

11

http://www.simple-talk.com/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

Es un problema interesante en Transact SQL, para los que hay una serie de soluciones y un debate considerable. ¿Cómo se puede producir un resultado resumido en el que se enumera una columna distintiva de cada fila en cada categoría particular en una columna 'agregado'? Una forma simple e intuitiva de mostrar datos es sorprendentemente difícil de lograr. Anith Sen da un resumen de diferentes maneras, y ofrece palabras de advertencia sobre el que usted elija ...

+1

Wow no trivial. –

+2

El artículo necesita una actualización: el CLR era para SQL Server 2005. 2008 admite múltiples parámetros en una función agregada, por lo que puede volver a crear los parámetros de GROUP_CONCAT de MySQL. –

+0

@OMG Ponies: ¿puedes explicar más o vincular por favor? No estoy muy seguro de lo que quiere decir ... – gbn

4

Si se trata de SQL Server 2017 o SQL Servidor vNext, la base de datos SQL Azure puede utilizar String_agg de la siguiente manera:

SELECT make.CarMakeId, make.CarMake, 
     CarModels = string_agg(model.CarModel, ', ') 
FROM CarModels model 
    INNER JOIN CarMakes make 
    ON model.CarMakeId = make.CarMakeId 
GROUP BY make.CarMakeId, make.CarMake 

de salida:

+-----------+-----------+---------------------------+ 
| CarMakeId | CarMake |   CarModels   | 
+-----------+-----------+---------------------------+ 
|   1 | SuperCars | Zoom, Wow, Awesome  | 
|   2 | MehCars | Mediocrity, YoureSettling | 
+-----------+-----------+---------------------------+ 
Cuestiones relacionadas