Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-es-ayuda by date

Next:From: Mario WojcikDate: 2008-02-27 17:44:43
Subject: Re: Join sobre una misma tabla...
Previous:From: Alvaro HerreraDate: 2008-02-27 16:58:21
Subject: Re: Obtene?==?iso-8859-1?Q?r "Curval()" de inserción masiva

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group