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.
                                          

Responder a