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

Re: Ayuda con consulta

From: Luis <esteban(at)princesa(dot)pri(dot)sld(dot)cu>
To: pgsql-es-ayuda(at)postgresql(dot)org
Subject: Re: Ayuda con consulta
Date: 2011-06-23 17:02:14
Message-ID: op.vxjf900ttyhnfo@jerusalen (view raw or flat)
Thread:
Lists: pgsql-es-ayuda
Hola,  :)

Me explico un poco mejor. En mi diseño tengo algunas tablas que  
constituyen clasificadores, como es el caso de la tabla productos, donde  
almaceno los productos(también los servicios) que compro: mani, sal,  
azucar, papel, alimentación y transporte. Luego cuando hago una  
inversión(una compra) almaceno en la tabla inversión la fecha de la  
operación y el monto de la misma. Luego, en otra tabla que llamo  
inversión_productos(pude haberla llamado inversión_detalles) almaceno los  
precios de cada producto para una inversión dada. Posteriormente haremos  
muchísimas inversiones más.

Las ventas(asociadas a una inversión concreta) que hacemos, por ejemplo,  
de cucuruchos de maní, las almacenamos en la tabla ventas. Aquí no pongo  
el producto, porque con el tiempo crecerá y el dato maní redundará, como  
los demás productos. Además conociendo la cantidad de maní que se vende un  
día determinado puedo precisar la venta, la inversión hecha en esa  
cantidad, la ganancia y otros datos más. Por eso es que considero no  
guardar datos que el sistema puede calcular en tiempo real cuando se  
ejecute la consulta. El diseño y datos de ejemplo para esta parte que  
comento es más o menos así,

CREATE TABLE productos(
     id_pro serial UNIQUE primary key,
     descripcion varchar(25) not null
);

GRANT select, insert, update, delete ON productos TO mani;

INSERT INTO productos (descripcion) VALUES
	('maní'),
	('papel'),
	('sal'),
	('azúcar'),
	('pasaje y alimentación');

/*
  * tabla inversion
  */

CREATE TABLE inversion(
     id_inv serial UNIQUE primary key,
     fecha date DEFAULT now(),
     importe numeric(6,2) not null CONSTRAINT importe_positivo  
CHECK(importe>0)
);

GRANT select, insert, update, delete ON inversion TO mani;

INSERT INTO inversion (fecha, importe) VALUES
	('21-06-2011', 1610.00);

/*
  * tabla inversion_productos
  */

CREATE TABLE inversion_productos(
     id_inv int REFERENCES inversion(id_inv),
     id_pro int REFERENCES productos(id_pro),
     precio numeric(6,2) not null CONSTRAINT importe_positivo  
CHECK(precio>0)
);

GRANT select, insert, update, delete ON inversion_productos TO mani;

INSERT INTO inversion_productos (id_inv, id_pro, precio) VALUES
	(1, 1, 16.00),
	(1, 5, 10.00);

/*
  * tabla ventas
  */

CREATE TABLE ventas(
     id_ven serial UNIQUE primary key,
     fecha date DEFAULT now(),
     cantidad_mani numeric(4,1) not null,
/*    ventas_estimadas numeric(6,2) not null,
     inversion numeric(6,2) not null,
     ganancia numeric(6,2) not null,
     diezmo numeric(5,2) not null,
     ofrenda numeric(5,2) not null,
     presupuesto numeric(6,2) not null,
     disponible numeric(6,2) not null,
*/
     id_inv int REFERENCES inversion(id_inv)
);



En Thu, 23 Jun 2011 10:49:09 -0400, Marcos Ortiz <mlortiz(at)uci(dot)cu> escribió:

> Lo que no veo por qué no los almacenas en la tabla,
> ¿probaste si hay detrimento del rendimiento?
>
> No optimices de forma prematura, prueba y leugo optimiza.
>
>
> El 6/23/2011 8:39 AM, Luis escribió:
>> Hola,
>>
>> Necesito una mano de los colegas con esta consulta.
>>
>> Tengo estas dos tablas:
>>
>> mani=# select * from productos;
>>  id_pro |      descripcion
>> --------+-----------------------
>>       1 | maní
>>       2 | papel
>>       3 | sal
>>       4 | azúcar
>>       5 | pasaje y alimentación
>> (5 filas)
>>
>> mani=# select * from ventas;
>>  id_ven |   fecha    | cantidad_mani | id_inv
>> --------+------------+---------------+--------
>>       1 | 2011-06-22 |           6.0 |      1
>> (1 fila)
>>
>> y necesito obtener los siguientes datos.
>>
>> fecha  |  cantidad_mani  |  ventas_estimadas(cantidad_mani*30)  |  
>> inversión(cantidad_mani*15)  |  ganancia(ventas_estimadas - inversión)
>>
>> Estaba probando así, y todo bien
>>
>> mani=# select fecha, cantidad_mani, cantidad_mani*30 as  
>> ventas_estimadas, cantidad_mani*(select precio from inversion_productos  
>> where id_pro=1) as inversion from ventas;
>>
>>    fecha    | cantidad_mani | ventas_estimadas | inversion
>> ------------+---------------+------------------+-----------
>>  2011-06-22 |           6.0 |            180.0 |    96.000
>> (1 fila)
>>
>> pero cuando trato de calcular la ganancia,
>>
>> mani=# select fecha, cantidad_mani, cantidad_mani*30 as  
>> ventas_estimadas, cantidad_mani*(select precio from inversion_productos  
>> where id_pro=1) as inversion, ventas_estimadas-inversion as ganancia  
>> from ventas;
>> ERROR:  no existe la columna «ventas_estimadas»
>> LÍNEA 1: ...inversion_productos where id_pro=1) as inversion,  
>> ventas_est...
>>
>> como ventas_estimadas e inversion no son campos de la tabla no puedo  
>> usarlos en el cálculo. Qué pues me sugieren?
>>
>> Inicialmente introducía todos los datos a la tabla pero consideré que  
>> era mejor guardar solo algunos y los demás calcularlos a partir de  
>> estos. Es elegante esto o es mejor guardarlos todos para ganar en  
>> velocidad a coste del tamaño de la db?
>>
>> Desde ya, muchas gracias
>>
>



-- 
Saludos,

Luis

--

Este mensaje le ha llegado mediante el servicio de correo electronico que ofrece Infomed para respaldar el cumplimiento de las misiones del Sistema Nacional de Salud. La persona que envia este correo asume el compromiso de usar el servicio a tales fines y cumplir con las regulaciones establecidas

Infomed: http://www.sld.cu/

In response to

pgsql-es-ayuda by date

Next:From: Alvaro HerreraDate: 2011-06-23 17:06:24
Subject: Re: comop programar con arrays
Previous:From: JuanDate: 2011-06-23 16:59:20
Subject: Re: extraer parte decimal

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