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 <mlor...@uci.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/
-
Enviado a la lista de correo pgsql-es-ayuda (pgsql-es-ayuda@postgresql.org)
Para cambiar tu suscripción:
http://www.postgresql.org/mailpref/pgsql-es-ayuda

Responder a