Bueno, me estoy respondiento... pero falta algo:

Para el ejemplo practico:

create table foo (
id serial,
periodo numeric   ,        
valor numeric,
cuota varchar(3),
tipo varchar(1)
)

insert into foo select nextval('foo_id_seq'), 200610,10,'C1','J';
insert into foo select nextval('foo_id_seq'), 200510,15,'C1','P';
insert into foo select nextval('foo_id_seq'), 200811,20,'C2','S';
insert into foo select nextval('foo_id_seq'), 200811,10,'C2','J';
insert into foo select nextval('foo_id_seq'), 200812,30,'C1','P';
insert into foo select nextval('foo_id_seq'), 200901,40,'C2','S';
insert into foo select nextval('foo_id_seq'), 200901,10,'C1','J';
insert into foo select nextval('foo_id_seq'), 200901,10,'C3','P';
insert into foo select nextval('foo_id_seq'), 200902,20,'C3','S';
insert into foo select nextval('foo_id_seq'), 200902,30,'C2','J';
insert into foo select nextval('foo_id_seq'), 200902,40,'C1','P';
insert into foo select nextval('foo_id_seq'), 200902,20,'C1','S';
insert into foo select nextval('foo_id_seq'), 201001,10,'C1','J';
insert into foo select nextval('foo_id_seq'), 201001,30,'C1','P';
insert into foo select nextval('foo_id_seq'), 201101,40,'C1','S';
insert into foo select nextval('foo_id_seq'), 201102,35,'C2','J';
insert into foo select nextval('foo_id_seq'), 201003,15,'C1','P';
insert into foo select nextval('foo_id_seq'), 201203,95,'C2','S';


SELECT CASE 
       WHEN SUBSTRING(periodo::VARCHAR,1,4)::NUMERIC < 2009  
            THEN '1 ANTERIOR'
       WHEN SUBSTRING(periodo::VARCHAR,1,4)::NUMERIC = 2009
            THEN '2 ACTUAL'
       ELSE '3 SIGUIENTE' 
       END AS periodo,
       cuota,
       SUM(CASE WHEN tipo='J' THEN valor 
                ELSE 0.00
           END) as jardin,
       SUM(CASE WHEN tipo='P' THEN valor
                ELSE 0.00
           END) as primaria,
       SUM(CASE WHEN tipo='S' THEN valor 
                ELSE 0.00
           END) as secundaria
  FROM foo
 GROUP BY periodo, cuota
 ORDER BY periodo, cuota;

Bien, el resultado es:

"periodo";"cuota";"jardin";"primaria";"secundaria"
"1 ANTERIOR";"C1";0.00;30;0.00
"1 ANTERIOR";"C1";10;0.00;0.00
"1 ANTERIOR";"C1";0.00;15;0.00
"1 ANTERIOR";"C2";10.00;0.00;20.00
"2 ACTUAL";"C1";0.00;40.00;20.00
"2 ACTUAL";"C1";10;0.00;0.00
"2 ACTUAL";"C2";0.00;0.00;40
"2 ACTUAL";"C2";30;0.00;0.00
"2 ACTUAL";"C3";0.00;10;0.00
"2 ACTUAL";"C3";0.00;0.00;20
"3 SIGUIENTE";"C1";0.00;15;0.00
"3 SIGUIENTE";"C1";10.00;30.00;0.00
"3 SIGUIENTE";"C1";0.00;0.00;40
"3 SIGUIENTE";"C2";35;0.00;0.00
"3 SIGUIENTE";"C2";0.00;0.00;95

Mas o menos lo que necesito, pero no logro que me agrupe en una sola linea
Por ejemplo, los 3 primeros registros por periodo y cuota (1 ANTERIRO y C1), 
sumarizando los niveles. O Sea, que me quede:

"1 ANTERIOR";"C1";10;45;0.00
"1 ANTERIOR";"C2";10.00;0.00;20.00

Eso si, quiero hacerlo en este mismo query, por que puede resolverse haciendo:

SELECT periodo, 
       cuota,
       SUM(jardin) as jardin,
       SUM(primaria) as primaria,
       SUM(secundaria) as secundaria
  from ( esta consulta )

pero si se puede resolver en la primera, barbaro!

Desde ya, gracias.
Saludos,

-----Mensaje original-----
De: [email protected] 
[mailto:[email protected]] En nombre de Conrado Blasetti
Enviado el: Viernes, 20 de Febrero de 2009 09:59 a.m.
Para: [email protected]
Asunto: [pgsql-es-ayuda] Reporte sql semi-offtopic

Gente, buenos días.

Comence a programar una funcion que retornaría un refcursor, pero antes de 
seguir, quería consultarles si es posible resolverlo desde una consulta sql.

Veamos,
Tengo una tabla foo:

periodo numeric           
valor numeric
cuota varchar(3)
tipo varchar(1)

Los datos que ingreso en ella, son estos:

Periodo         valor           cuota           tipo
200610          10              C1              J
200510          15              C1              P
200811          20              C2              S
200811          10              C2              J       
200812          30              C1              P

200901          40              C2              S
200901          10              C1              J
200901          10              C3              P
200902          20              C3              S
200902          30              C2              J
200902          40              C1              P
200902          20              C1              S

201001          10              C1              J
201001          30              C1              P
201101          40              C1              S
201102          35              C2              J
201003          15              C1              P
201203          95              C2              S

Bueno, es un ejemplo de un sistema de cobranza donde debería armar un reporte 
agrupando:


Periodo Anterior (en este caso 2005,2006,2008)
Periodo Actual (en este caso 2009)
Periodo Siguiente (en este caso 2010,20011,20012)

Esto sería agrupando el valor y el tipo pero....

Necesitan el tipo dispuesto en columna y el periodo en filas, o sea, con los 
datos de arriba:


Periodo Anterior (en este caso 2005,2006,2008)

Cuota           TIPO J          TIPO P          TIPO S
C1              10                      45                      0
C2              10                      0                       20
C3              0                       0                       0
C4              0                       0                       0

Periodo Actual (en este caso 2009)

Cuota           TIPO J          TIPO P          TIPO S
C1              10                      40                      20
C2              30                      0                       40
C3              0                       10                      20
C4              0                       0                       0

Periodo Actual (en este caso 2010,20011,20012)

Cuota           TIPO J          TIPO P          TIPO S
C1              10                      45                      40
C2              35                      0                       95
C3              0                       0                       0
C4              0                       0                       0

Bueno, espero se pueda interpretar el tipo de informe que necesito.
Ven que C4 no tiene valor, es por que es una cuota que existe pero sin datos, o 
sea, un IN (c1,c2,c3,c4) no me sirve, ya que c4 no tiene filas y no me 
apareceran.
Por otro lado, J P S son los niveles Jardin Primaria Secundaria, son atributos 
de la fila pero tranquilamente se puede _hardcodear_ para encolumnar, no va a 
crecer.

Bueno, si esto es posible hacerlo por sql, realmente me van a sorprender jeje.
Igualmente, evaluo el costo-beneficio, si el sql es muy muy muy enrollado para 
mantener, por ahí el costo de seguir con una funcion refcursor es mas 
beneficioso.

Desde ya, gracias.
Saludos,
Conrado
--
TIP 2: puedes desuscribirte de todas las listas simultáneamente
    (envía "unregister TuDirecciónDeCorreo" a [email protected])
--
TIP 7: no olvides aumentar la configuración del "free space map"

Responder a