From: | "Conrado Blasetti" <conrado(at)mapfre(dot)com(dot)ar> |
---|---|
To: | <pgsql-es-ayuda(at)postgresql(dot)org> |
Subject: | RE: Reporte sql semi-offtopic |
Date: | 2009-02-20 14:18:19 |
Message-ID: | 76A99F19229DC440909CF1B905F8012C078E455E@sar001998.Mapfre.ar |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
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: pgsql-es-ayuda-owner(at)postgresql(dot)org [mailto:pgsql-es-ayuda-owner(at)postgresql(dot)org] En nombre de Conrado Blasetti
Enviado el: Viernes, 20 de Febrero de 2009 09:59 a.m.
Para: pgsql-es-ayuda(at)postgresql(dot)org
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 majordomo(at)postgresql(dot)org)
From | Date | Subject | |
---|---|---|---|
Next Message | Oswaldo Hernández | 2009-02-20 15:20:00 | Re: Reporte sql semi-offtopic |
Previous Message | Conrado Blasetti | 2009-02-20 11:59:00 | Reporte sql semi-offtopic |