Ver Mensaje Individual
  #2  
Antiguo 21-05-2017
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bogotá, Colombia
Posts: 833
Reputación: 21
gatosoft Va camino a la fama
El problema debe estar en que no estan cruzando los valores que tienes guardados en el mes, versus la serie generada:

cuando generas la serie, las cataegorias que se arman son: 1,2,3...12

Asi que en tu tabla de descargas debes almacenar un valor numerico en el campo mes, 1 para enero, 2 para febrero y asi...

Este ejercicio a mi me funciona:

Código SQL [-]
create table Descargas2
( llave serial primary key,
  archivo varchar(10),
  mes integer,
  Total integer
);


insert into Descargas2 values(default, 'STARWARS',1,100);
insert into Descargas2 values(default, 'STARWARS',2,123);
insert into Descargas2 values(default, 'STARWARS',5,234);
insert into Descargas2 values(default, 'STARWARS',12,36);

insert into Descargas2 values(default, 'TITANIC',2,50);
insert into Descargas2 values(default, 'TITANIC',4,456);
insert into Descargas2 values(default, 'TITANIC',6,420);
insert into Descargas2 values(default, 'TITANIC',7,506);

SELECT * FROM crosstab(
'SELECT archivo, mes, total FROM descargas2 order by 1, 2', 
'SELECT m FROM generate_series(1,12) m' )
AS report (   archivo text, "Ene" text, "Feb" text, "Mar" text, "Abr" text, "May" text, "Jun" text, "Jul" text, "Ago" text, "Sep" text, "Oct" text, "Nov" text, "Dic" text  );


Por otro lado, si en el campo mes estas guardando valores tipo texto, entonces debes generar una serie tipo texto, asi:


Código SQL [-]
create table Descargas
( llave serial primary key,
  archivo varchar(10),
  mes varchar(10),
  Total integer
);


insert into Descargas values(default, 'STARWARS','ENERO',100);
insert into Descargas values(default, 'STARWARS','FEBRERO',123);
insert into Descargas values(default, 'STARWARS','MAYO',234);
insert into Descargas values(default, 'STARWARS','DICIEMBRE',36);

insert into Descargas values(default, 'TITANIC','FEBRERO',50);
insert into Descargas values(default, 'TITANIC','ABRIL',456);
insert into Descargas values(default, 'TITANIC','JUNIO',420);
insert into Descargas values(default, 'TITANIC','JULIO',506);

SELECT * FROM crosstab(
'SELECT archivo, mes, total FROM descargas order by 1, 2' 
,'SELECT elMes FROM (SELECT 1 orden, ''ENERO'' as elMes UNION SELECT 2, ''FEBRERO'' UNION SELECT 3, ''MARZO'' UNION SELECT 4, ''ABRIL'' UNION SELECT 5,''MAYO'' UNION SELECT 6, ''JUNIO'' UNION SELECT 7, ''JULIO'' UNION SELECT 8,''AGOSTO'' UNION SELECT 9,''SEPTIEMBRE'' UNION SELECT 10,''OCTUBRE'' UNION SELECT 11,''NOVIMEBRE'' UNION SELECT 12,''DICIEMBRE'' order by orden) C'
)
AS report (   archivo text, "Ene" text, "Feb" text, "Mar" text, "Abr" text, "May" text, "Jun" text, "Jul" text, "Ago" text, "Sep" text, "Oct" text, "Nov" text, "Dic" text  );

en el codigo anterior hay una "triquñuela" que se debe hacer adicional y es la de agregar el orden en el select para que respecte el orden ENERO =1 FEBRERO=2

Espero que te sirva
Responder Con Cita