¿Cómo convertir columnas a renglones?

17 10 2008

Problema:

Tengo una tabla más o menos así…

TiendaID AñoFiscal Indicador Dia1 Dia2 Dia365
1 2009 1 45 55   76
1 2009 1 42 53   72

Se requiere escribir un query con la sintaxis de Oracle que voltee los renglones a columnas (e.g. las ventas del día 3 al 21 del mes). Es Oracle 8i así que no se pueden usar instrucciones sofisticadas. Además se requiere que dicho query funcione con DB2 por lo que la sintaxis deberá ser lo más atea posible.

El rango de fechas es dinámico.

¿quién se apunta?

¿POR QUÉEE, POR QUÉEEE, POR QUÉE ME HACEN ESTO A MI? Crying

Advertisement

Acciones

Información

3 respuestas

17 10 2008
Rodney Pacheco

Hola, hace un tiempo sufrí algo parecido, trabajo con SQL Server 2005 y existe un comando llamado Pivot que te transpone una salida SQL, el comando es algo asi como…

‘SELECT * FROM #T1 PIVOT (MAX(Vp) FOR Fecha IN (‘ + @Fechas + ‘)) AS VP’)

Investiga si existe algo así en Oracle, espero que te de al menos una luz…

Suerte!!

17 10 2008
Adrian

Mil gracias Rodney

Si, existe algo parecido en la 9i o la 10g, lo malo es que es Oracle8i que sería como usar SqlServer 7, todas esas opciones sofisticadas aparecieron recientemente. Al parecer ya me hecho una función de SQL que genera un SQL que voltea todo pero me faltan los detalles finales

Mil gracias por la ayuda!
Adrian

20 10 2008
Adrian

Pues despues de mucho pensarle quedó más sencillo que lo que pensaba

create or replace
function
fnNumsAsString(nIniNum integer, nEndNum integer, sStrUnion varchar, sStrBefore varchar, sStrAfter varchar)
return varchar
as
sStringWithNumbers varchar(1000);
nNumber int;
begin

if nIniNum > nEndNum then
return ”;
end if;

nNumber := nIniNum;
/*lo hacemos al menos una vez*/
sStringWithNumbers := sStrBefore|| TO_CHAR (nNumber, ‘FM9999′)|| ‘ as ColumnId, SUM(’|| TO_CHAR (nNumber, ‘FM9999′)||’) ‘||sStrAfter;
nNumber := nIniNum+1;

WHILE nNumber <= nEndNum LOOP
sStringWithNumbers := sStringWithNumbers||sStrUnion ||sStrBefore|| TO_CHAR (nNumber, ‘FM9999′)||sStrAfter;
nNumber := nNumber + 1;
END LOOP;

return sStringWithNumbers;
end;

Esta función me genera un SQL que voltea el resultado a renglones. Ya solo hay que ejecutarlo y todo se voltea, le concatena el ID para saber a que columna me refiero, en mi caso dicho id representa el dia.

Si ejecuto:

select fnSwapColumnsForRows( 1,3, ’select ‘, ‘from indicadores_en_dias’ ,’ union all ‘,’Dia_’,’_Metrica’) from dual;

el resultado es el siguiente:

select 1 as ColumnId, SUM(Dia_1_Metrica) from indicadores_en_dias union all select 2 as ColumnId, SUM(Dia_2_Metrica) from indicadores_en_dias union all select 3 as ColumnId, SUM(Dia_3_Metrica) from indicadores_en_dias

Deja un comentario

Fill in your details below or click an icon to log in:

Gravatar
Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s




Seguir

Get every new post delivered to your Inbox.