Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > PostgreSQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-05-2017
Luenguok Luenguok is offline
Registrado
 
Registrado: may 2017
Posts: 1
Poder: 0
Luenguok Va por buen camino
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.

Última edición por Casimiro Notevi fecha: 15-05-2017 a las 18:06:56. Razón: No olvides las etiquetas de código
Responder Con Cita
  #2  
Antiguo 21-05-2017
Avatar de gatosoft
[gatosoft] gatosoft is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Bucaramanga, Colombia
Posts: 686
Poder: 15
gatosoft Va por buen camino
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
__________________
gatosoft [M.40.co]
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Ayuda BD Access? Ayuda al modificar!! DarkArias Conexión con bases de datos 4 24-08-2013 23:47:41
Trasnformadas, crosstab, pivot, referencias cruzadas ... fjcg02 Firebird e Interbase 13 20-09-2012 23:26:35
ayuda con strtofloat, ayuda punto flotante TURING Varios 5 30-04-2004 08:03:59
Crosstab y fastreport IVAND Impresión 0 27-01-2004 18:12:09
Display format en Fast Report CrossTab nugame Impresión 0 19-12-2003 13:19:42


La franja horaria es GMT +2. Ahora son las 16:58:03.


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