Crosstab informacion de meses

From: Arturo Garcia <josearturogarcia(at)hotmail(dot)com>
To: <pgsql-es-ayuda(at)postgresql(dot)org>
Subject: Crosstab informacion de meses
Date: 2011-04-11 20:12:51
Message-ID: COL104-W3635043AFCA937F6F2E26DCCA80@phx.gbl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-es-ayuda


Estimados compañeros, ojalá me puedan apoyar con éste problema que tengo.

Tengo una tabla en donde llevo los importes acumulados de varios trabajadores, esta es la estructura de la tabla:

CREATE TABLE sis.acumes
(
aa smallint NOT NULL, -- Año de acumulación.
mes smallint NOT NULL, -- Mes de acumulación.
tponom character varying(2) NOT NULL, -- Tipo de nómina.
numemp integer NOT NULL, -- Número de empleado.
cvecon character varying(4) NOT NULL, -- Clave de concepto.
importe numeric(10,2), -- Importe acumulado por mes.
CONSTRAINT acumes_pk PRIMARY KEY (aa, mes, tponom, numemp, cvecon),
CONSTRAINT empleado_acumes_fk1 FOREIGN KEY (tponom, numemp)
REFERENCES sis.empleado (tponom, numemp) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)

Normalmente casi todos los trabajadores, tienen información en todos los meses, pero es posible que a algunos les falte información en algunos meses.
Imaginemos que como parte de los registros de ésta tabla existe entre ellos uno asi:

aa mes tponom numemp cvecon importe
2011 1 GE 299 P001 1000.50
2011 3 GE 299 P001 1230.45

Necesito sacar un reporte tabular que me presente la información asi:

numemp paterno materno nombre cvecon descripcion nat ene feb mar abr may .... dic total
text text text text text text text numeric numeric numeric numeric numeric numeric numeric
299 PEREZ DOMINGUEZ JUAN P001 SALARIOS P 1000.50 0.0 1230.45 0.0 0.0 0.0 2230.95

Cuando no existe información en alguno de los meses, la debería mostrar en cero, como se muestra en el ejemplo anterior.

El problema es que al no existir el mes 2, la información me la recorre y erróneamente (para mis necesidades) me la presenta asi:

numemp paterno materno nombre cvecon descripcion nat ene feb mar abr may .... dic total
text text text text text text text numeric numeric numeric numeric numeric numeric numeric
299 PEREZ DOMINGUEZ JUAN P001 SALARIOS P 1000.50 1230.45 0.0 0.0 0.0 0.0 2230.95

De tal forma que la información correspondiente a marzo, me la está presentando en el mes de febrero, y pues así no debe ser.
Este es mi query, que puedo hacer para poder presentar la información en la forma deseada? Que tengo que hacer o modificar?

SELECT rowname[1] AS numemp,rowname[2] AS paterno,rowname[3] AS materno,rowname[4] AS nombre,rowname[5] AS cvecon,rowname[6] AS descripcion,
rowname[7] AS nat,ene,feb,mar,abr,may,jun,jul,ago,sep,oct,nov,dic,
COALESCE(ene,0)+COALESCE(feb,0)+COALESCE(mar,0)+COALESCE(abr,0)+COALESCE(may,0)+COALESCE(jun,0)+
COALESCE(jul,0)+COALESCE(ago,0)+COALESCE(sep,0)+COALESCE(oct,0)+COALESCE(nov,0)+COALESCE(dic,0) as total
FROM crosstab(
'SELECT array[acumes.numemp::text, empleado.paterno,empleado.materno,empleado.nombre,acumes.cvecon,descripcion,cat_concepto.naturaleza],mes::text,importe::decimal
FROM sis.acumes,sis.cat_concepto,sis.empleado
WHERE acumes.cvecon = cat_concepto.cvecon
AND acumes.numemp = empleado.numemp
AND acumes.tponom = empleado.tponom
AND acumes.aa = ' || 2011 || '
AND acumes.tponom = ''' || 'GE' || '''
and acumes.numemp = 299
and acumes.cvecon = ''P001''
ORDER BY acumes.numemp,empleado.paterno,empleado.materno,empleado.nombre,cat_concepto.naturaleza DESC,acumes.cvecon'
)
as cr(rowname text[],ene decimal,feb decimal,mar decimal,abr decimal,may decimal,jun decimal,
jul decimal,ago decimal,sep decimal,oct decimal,nov decimal,dic decimal)

Espero su apoyo.
Gracias anticipadas y saludos a todos.

In response to

Responses

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alejandro Brust at federacion 2011-04-11 20:17:17 Re: vacuumdb excluir tablas
Previous Message Lazaro Rubén García Martinez 2011-04-11 20:02:18 RE: Sobre expresion regular!!!