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
Views: Raw Message | Whole Thread | Download mbox | Resend email
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

Browse pgsql-es-ayuda by date

  From Date Subject
Next Message Alvaro Herrera 2011-06-23 17:06:24 Re: comop programar con arrays
Previous Message Juan 2011-06-23 16:59:20 Re: extraer parte decimal