From: | Alejandro Salamanca <alejandro(at)redcetus(dot)com> |
---|---|
To: | pgsql-es-ayuda(at)postgresql(dot)org |
Subject: | Re: Join sobre una misma tabla... |
Date: | 2008-02-27 17:01:56 |
Message-ID: | 33339901.28101204131716526.JavaMail.root@mail |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
Se me ocurren un par de soluciones:
a) Partiendo de las siguientes consultas (que entiendo serían las necesarias sobre la tabla estadistica):
-- P1 :: para un período dado (por ejemplo entre el 23 de febrero del 2007 y el 8 de agosto del 2007 )
select item, sum(kilos) as kilos_periodo, sum(precio) as precio_periodo from estadistica where date( fecha ) between date( '2007-02-23' ) and date( '2007-08-08' ) group by item;
-- P2 :: para el mismo período pero un año antes
select item, sum(kilos) as kilos_anterior, sum(precio) as precio_anterior from estadistica where date( fecha ) between date( '2006-02-23' ) and date( '2006-08-08' ) group by item;
Conjuncionamos en un solo resultado:
select p1.item, p1.kilos_periodo, p2.kilos_anterior, p1.precio_periodo, p2.precio_anterior from
( select item, sum(kilos) as kilos_periodo, sum(precio) as precio_periodo from estadistica where date( fecha ) between date( '2007-02-23' ) and date( '2007-08-08' ) group by item ) p1, ( select item, sum(kilos) as kilos_anterior, sum(precio) as precio_anterior from estadistica where date( fecha ) between date( '2006-02-23' ) and date( '2006-08-08' ) group by item ) p2 where p1.item = p2.item;
b) Con los mismos supuestos del anterior pero sin subconsultas:
select item, sum( case when date( fecha ) between date( '2007-02-23' ) and date( '2007-08-08' ) then kilos else 0 ) as kilos_periodo, sum( case when date( fecha ) between date( '2006-02-23' ) and date( '2006-08-08' ) then kilos else 0 ) as kilos_anterior, sum( case when date( fecha ) between date( '2007-02-23' ) and date( '2007-08-08' ) then precio else 0 ) as precio_periodo, sum( case when date( fecha ) between date( '2006-02-23' ) and date( '2006-08-08' ) then precio else 0 ) as precio_anterior from estadistica where ( date( fecha ) between date( '2007-02-23' ) and date( '2007-08-08' ) ) or ( date( fecha ) between date( '2006-02-23' ) and date( '2006-08-08' ) ) group by item;
Espero sean de utilidad.
Un abrazo
----- Original Message -----
From: "Alvaro Herrera" <alvherre(at)commandprompt(dot)com>
To: "Mario Wojcik" <mariowojcik(at)yahoo(dot)com(dot)ar>
Cc: "Lista de Ayuda Postgresql" <pgsql-es-ayuda(at)postgresql(dot)org>
Sent: Wednesday, February 27, 2008 11:19:29 AM (GMT-0400) America/Caracas
Subject: Re: [pgsql-es-ayuda] Join sobre una misma tabla...
Mario Wojcik escribió:
> Tengo el siguiente problema:
> En la tabla ESTADISTICA tengo los campos KILOS y PRECIO
> Necesito que mi consulta sql me retorne SUM(KILOS),SUM(PRECIO) pero de
> dos periodos entre las fechas dadas y de un año antes.
> Pero siempre sobre la misma tabla...
> ¿Es posible hacer esto con SQL?
Claro, se llama "self-join". Busca en Google.
--
Alvaro Herrera http://www.CommandPrompt.com/
The PostgreSQL Company - Command Prompt, Inc.
--
TIP 8: explain analyze es tu amigo
From | Date | Subject | |
---|---|---|---|
Next Message | Mario Wojcik | 2008-02-27 17:44:43 | Re: Join sobre una misma tabla... |
Previous Message | Alvaro Herrera | 2008-02-27 16:58:21 | Re: Obtener "Curval()" de inserción masiva |