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? ![]()


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!!
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
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
donde defines la fnSwapColumnsForRows?
o como funciona esta función?