SQL - Insert that receives calculated values from other columns of other tables

Asked

Viewed 153 times

0

I want to do an Insert where the sales value column (from the sales table) is filled automatically which will be the unit value(contained in the product table) * quantity (this in the sales table).

Does anyone know how to do it?

2 answers

1

Assuming your structure and your data are something like:

CREATE TABLE tb_vendas
(
      id SERIAL,
      id_produto INTEGER,
      valor_venda REAL,
      quantidade INTEGER
);

CREATE TABLE tb_produto
(
      id INTEGER,
      nome TEXT,
      valor_unitario REAL
);

-- PRODUTOS CADASTRADOS
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 1, 'CANETA', 1.50 );
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 2, 'LAPIS', 0.55 );
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 3, 'GRAMPEADOR', 14.50 );
INSERT INTO tb_produto( id, nome, valor_unitario ) VALUES ( 4, 'CADERNO', 4.75 );

You can "register" your vendas thus:

-- VENDEU 3 CADERNOS
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 3, p.valor_unitario * 3 FROM tb_produto AS p WHERE p.id = 4);

-- VENDEU 2 GRAMPEADORES
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 2, p.valor_unitario * 2 FROM tb_produto AS p WHERE p.id = 3);

-- VENDEU 10 LAPIS
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 10, p.valor_unitario * 10 FROM tb_produto AS p WHERE p.id = 2);

-- VENDEU 7 CANETAS
INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
(SELECT p.id, 7, p.valor_unitario * 7 FROM tb_produto AS p WHERE p.id = 1);

Checking out the vendas:

SELECT
    v.id,
    p.nome,
    p.valor_unitario,
    v.quantidade,
    v.valor_venda
FROM
    tb_vendas AS v
JOIN
    tb_produto AS p ON ( p.id = v.id_produto  );

Exit:

| id |       nome | valor_unitario | quantidade | valor_venda |
|----|------------|----------------|------------|-------------|
| 24 |     CANETA |            1.5 |          7 |        10.5 |
| 23 |      LAPIS |           0.55 |         10 |         5.5 |
| 22 | GRAMPEADOR |           14.5 |          2 |          29 |
| 21 |    CADERNO |           4.75 |          3 |       14.25 |

See working on SQL Fiddle

Another alternative solution is the implementation of a FUNCTION capable of registering a venda from the id of produto and of quantidade sold:

CREATE OR REPLACE FUNCTION fc_registrar_venda( INTEGER, INTEGER )
RETURNS INTEGER AS
$$
BEGIN
   INSERT INTO tb_vendas ( id_produto, quantidade, valor_venda )
   (SELECT p.id, $2, p.valor_unitario * $2 FROM tb_produto AS p WHERE p.id = $1);
   RETURN currval( pg_get_serial_sequence('tb_vendas','id') );
END;
$$
LANGUAGE plpgsql;

Registering the vendas with the FUNCTION:

-- COMPROU 3 CADERNOS
SELECT fc_registrar_venda( 4, 3 );

-- COMPROU 2 GRAMPEADORES
SELECT fc_registrar_venda( 3, 2 );

-- COMPROU 10 LAPIS
SELECT fc_registrar_venda( 2, 10 );

-- COMPROU 7 CANETAS
SELECT fc_registrar_venda( 1, 7 );

See working on SQL Fiddle

  • +1! Maybe explain at the top, by way of summary, something like "you can insert the result of a select, not only data pure"

0

With Sub Select:

INSERT INTO VENDAS (produto,quantidade,valor_venda) values 
(::produto,::quantidade,((select valor_unitario from produtos where codigo = ::produto)*::quantidade));

where ::produto is the product code you will insert in the sale, and ::quantidade is the amount you will enter in the sale.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.