¿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

About these ads

Acciones

Información

4 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

11 06 2012
Nicolas

donde defines la fnSwapColumnsForRows?
o como funciona esta función?

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Conectando a %s




Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 29 seguidores