2010-02-26 17 views
6

? Aquí hay un question en stackoverflow con el mismo título, pero eso no es lo que estoy buscando.
Tengo una tabla como la siguiente¿Cómo puedo transformar filas en columnas en SQL server 2005

Name | Count 
----------------  
Chery | 257 
Drew | 1500 
Morgon | 13 
Kath | 500 
Kirk | 200 
Matt | 76 

necesito trasform este conjunto de resultados en algo como esto

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 

¿Cómo puedo lograr esto utilizando SQL Server 2005?

Respuesta

5

hay preguntas similares here, here respondidas en stackoverflow.

Es necesario utilizar el operador PIVOT en su consulta a acheive this.Here es el ejemplo y la explicación de cómo se puede hacer ello.El ejemplo se hace referencia desde this fuente.

---I assumed your tablename as TESTTABLE--- 
DECLARE @cols NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
           '],[' + t.Name 
         FROM TESTTABLE AS t 
         ORDER BY '],[' + t.Name 
         FOR XML PATH('') 
        ), 1, 2, '') + ']' 

SET @query = N'SELECT '+ @cols +' FROM 
(SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p 
PIVOT (MAX([Count]) FOR Name IN ('+ @cols +')) 
AS pvt;' 

EXECUTE(@query) 

Explicación

1. La primera parte de la consulta

SELECT @cols = STUFF((SELECT DISTINCT TOP 100 PERCENT 
         '],[' + t.Name 
       FROM TESTTABLE AS t 
       ORDER BY '],[' + t.Name 
       FOR XML PATH('') 
      ), 1, 2, '') + ']' 

que da un resultado agradable aplanado de sus valores de columna Nombre en una sola fila como sigue

[Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt] 

Puede lea Más información sobre STUFF y XML PATH here y here.

2. SELECT + @cols + FROM seleccionará todas las filas como nombres de Coloumn para el conjunto de resultados finales (Pvt - paso 3)

es decir

Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 

3.Esta consulta extrae todas las filas de datos que necesitamos para crear los resultados de la tabla cruzada. El (p) después de la consulta es la creación de una tabla temporal de los resultados que se pueden usar entonces para satisfacer la consulta para el paso 1.

(SELECT t1.Name, t1.Count FROM TESTTABLE AS t1) p 

4.El expresión PIVOT

PIVOT (MAX (Count) FOR Name IN (@cols) AS pvt 

hace el real resumen y pone los resultados en una tabla temporal denominada Pvt como

Chery | Drew | Morgon | Kath | Kirk | Matt 
------------------------------------------- 
257  1500  13  500 200 76 
+0

+1, gran solución y respuesta. tenga en cuenta que el 'TOP 100 PERCENT' se puede cambiar a 'TOP 30' o lo que sea, por lo que no debe exceder el número de columnas si tiene muchas filas. –

2

Ver Using PIVOT and UNPIVOT.

Puede utilizar los PIVOT y UNPIVOT operadores relacionales para cambiar una expresión con valores de tabla en otra tabla . PIVOT hace girar un expresión de valor de tabla girando los únicos valores de una columna en la expresión en varias columnas en la salida, y realiza agregaciones donde son necesarios en cualquier valores de columna restantes que son querían en la final salida. UNPIVOT realiza la operación opuesta a PIVOT rotando columnas de una expresión de valor de tabla en los valores de columna .

La respuesta rápida es

SELECT Chery, Drew, Morgon, Kath, Kirk, Matt 
FROM 
(SELECT [Name], [Count] From Foo) 
PIVOT 
(
    MIN([Count]) 
    FOR [Name] IN (Chery, Drew, Morgon, Kath, Kirk, Matt) 
) AS PivotTable 
0

Si se quiere evitar complicados como un pivote o la respuesta aceptada, usted puede hacer esto! (la mayoría del código solo está configurando los datos de prueba por si alguien quiere probarlo)

/* set up your test table */ 
declare @TestData table (Name Varchar(80),[Count] int)  
insert into @TestData (Name, [count]) 
Select 'Chery' as name, 257 as [count] 
union all select 'Drew', 1500 
union all select 'Morgon',13 
union all select 'Kath', 500 
union all select 'Kirk', 200 
union all select 'Matt', 76 

/* the query */ 
Declare @Query Varchar(max) 
Select @Query=Coalesce(@query+', ','SELECT ') +Convert(VarChar(5),[count]) +' as ['+name+']' 
from @TestData 
Execute (@Query) 
/* result 

Chery  Drew  Morgon  Kath  Kirk  Matt 
----------- ----------- ----------- ----------- ----------- ----------- 
257   1500  13   500   200   76 

*/ 
Cuestiones relacionadas