2012-04-05 23 views
11

tengo una tabla como ésta en mi base de datos (SQL Server 2008)Cómo pivotar columnas de texto en SQL Server?

ID  Type   Desc 
-------------------------------- 
C-0 Assets   No damage 
C-0 Environment  No impact 
C-0 People   No injury or health effect 
C-0 Reputation  No impact 
C-1 Assets   Slight damage 
C-1 Environment  Slight environmental damage 
C-1 People   First Aid Case (FAC) 
C-1 Reputation  Slight impact; Compaints from local community 

tengo que mostrar los Activos, la gente, el Medio Ambiente y su reputación como columnas y visualización de la descripción igualados como valores. Pero cuando ejecuto la consulta pivote, todos mis valores son nulos.

¿Alguien puede ver mi consulta y decirme dónde estoy haciendo mal?

Select severity_id,pt.[1] As People, [2] as Assets , [3] as Env, [4] as Rep 
FROM 
(
    select * from COMM.Consequence 
) As Temp 
PIVOT 
(
    max([DESCRIPTION]) 
    FOR [TYPE] In([1], [2], [3], [4]) 
) As pt 

Aquí está mi salida

ID People Assets Env  Rep 
----------------------------------- 
C-0 NULL NULL NULL NULL 
C-1 NULL NULL NULL NULL 
C-2 NULL NULL NULL NULL 
C-3 NULL NULL NULL NULL 
C-4 NULL NULL NULL NULL 
C-5 NULL NULL NULL NULL 

Respuesta

20
Select severity_id, pt.People, Assets, Environment, Reputation 
FROM 
(
    select * from COMM.Consequence 
) As Temp 
PIVOT 
(
    max([DESCRIPTION]) 
    FOR [TYPE] In([People], [Assets], [Environment], [Reputation]) 
) As pt 
+2

Gracias Mikael !!!! – Dinesh

+1

¡De nada! –

+0

Tenía curiosidad por qué en el primer pt seleccionado. Se utilizó la gente, pero el pt. el prefijo no es necesario aquí – Jowen

0

Reconstruí esto en SQL Server y funciona muy bien.

Estoy tratando de convertir esto al trabajo cuando uno no sabe cuál será el contenido en las columnas TIPO y DESCRIPCIÓN.

También estaba usando esto como una guía. (Convert Rows to columns using 'Pivot' in SQL Server)

EDITAR ----

Aquí está mi solución para lo anterior en el que no conocen el contenido, ya sea en el campo ....

-- setup commands 
     drop table #mytemp 
     go 

     create table #mytemp (
      id varchar(10), 
      Metal_01 varchar(30), 
      Metal_02 varchar(100) 
     ) 


-- insert the data 
     insert into #mytemp 
     select 'C-0','Metal One','Metal_One' union all 
     select 'C-0','Metal & Two','Metal_Two' union all 
     select 'C-1','Metal One','Metal_One' union all 
     select 'C-1','Metal (Four)','Metal_Four' union all 
     select 'C-2','Metal (Four)','Metal_Four' union all 
     select 'C-2','Metal/Six','Metal_Six' union all 
     select 'C-3','Metal Seven','Metal_Seven' union all 
     select 'C-3','Metal Eight','Metal_Eight' 

-- prepare the data for rotating: 
     drop table #mytemp_ReadyForRotate 
     select *, 
        replace(
         replace(
          replace(
           replace(
            replace(
               mt.Metal_01,space(1),'_' 
              ) 
             ,'(','_' 
             ) 
            ,')','_' 
            ) 
           ,'/','_' 
           ) 
          ,'&','_' 
          ) 
        as Metal_No_Spaces 
     into #mytemp_ReadyForRotate 
     from #mytemp mt 

    select 'This is the content of "#mytemp_ReadyForRotate"' as mynote, * from #mytemp_ReadyForRotate 

-- this is for when you KNOW the content: 
-- in this query I am able to put the content that has the punctuation in the cell under the appropriate column header 

     Select id, pt.Metal_One, Metal_Two, Metal_Four, Metal_Six, Metal_Seven,Metal_Eight 
     FROM 
     (
      select * from #mytemp 
     ) As Temp 
     PIVOT 
     (
      max(Metal_01) 
      FOR Metal_02 In(
           Metal_One, 
           Metal_Two, 
           Metal_Four, 
           Metal_Six, 
           Metal_Seven, 
           Metal_Eight 
     ) 
     ) As pt 


-- this is for when you DON'T KNOW the content: 
-- in this query I am UNABLE to put the content that has the punctuation in the cell under the appropriate column header 
-- unknown as to why it gives me so much grief - just can't get it to work like the above 
-- it WORKS just fine but not with the punctuation field 
     drop table ##csr_Metals_Rotated 
     go 

     DECLARE @cols AS NVARCHAR(MAX), 
      @query AS NVARCHAR(MAX), 
      @InsertIntoTempTable as nvarchar(4000) 

     select @cols = STUFF((SELECT ',' + QUOTENAME(Metal_No_Spaces) 
          from #mytemp_ReadyForRotate 
          group by Metal_No_Spaces 
          order by Metal_No_Spaces 
        FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 

     set @query = 'SELECT id,' + @cols + ' into ##csr_Metals_Rotated from 
        (
         select id as id, Metal_No_Spaces 
         from #mytemp_ReadyForRotate 
        ) x 
        pivot 
        (
         max(Metal_No_Spaces) 
         for Metal_No_Spaces in (' + @cols + ') 
        ) p ' 
     execute(@query); 

     select * from ##csr_Metals_Rotated 
+0

Si bien esto puede responder teóricamente a la pregunta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir las partes esenciales del Responda aquí y proporcione el enlace de referencia. – GhostCat

+0

Tengo que disculparme, mi "respuesta" no responde la pregunta. - Solo necesitaba que la respuesta publicada en esta publicación fuera dinámica ... donde el programador no conocía el contenido de los campos, sin embargo, el servidor sql podría crear los campos sobre la marcha y rellenarlos. - Pude averiguarlo y publicaré mis hallazgos aquí en unos días - en un momento de crisis en este momento. – user2792497

Cuestiones relacionadas