Re: Join sobre una misma tabla...

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

Browse pgsql-es-ayuda by date

  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