Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   PostgreSQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=42)
-   -   Ayuda con Crosstab (https://www.clubdelphi.com/foros/showthread.php?t=91844)

Luenguok 15-05-2017 18:58:33

Ayuda con Crosstab
 
Buenos días, Estoy tratatando de realizar una consulta tipo referencia cruzada en postgresql pero no logro obtener resultados. En access lo he logrado realizar de la siguiente manera:

Código SQL [-]
TRANSFORM Sum(total) AS Total
SELECT tema, archivo
FROM Descargas
GROUP BY tema, archivo
PIVOT mes;

en postgresql intento con lo siguiente:

Código SQL [-]
SELECT * FROM crosstab(
'SELECT archivo, mes, total FROM v_descargas 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 );

esto me devuelve la cantidad de filas y columnas exactas pero en valor me sale nulo, no llega a contabilizar cuantas descargas por mes tiene un archivo.

gatosoft 21-05-2017 06:02:07

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


La franja horaria es GMT +2. Ahora son las 13:48:42.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi