See the best-selling product

Asked

Viewed 1,282 times

1

I’m having trouble joining two tables and using some aggregation function, I’ve tried it like this:

SELECT nome FROM produto
INNER JOIN vendaproduto SUM(quantidade)
ON produto.idproduto = vendaproduto.idproduto

only that it is giving error...

  • It would be good if you put the error that is returning and if possible an example of how you need to output this data. In the code you posted failed to put the SUM in SELECT and add a GROUP BY: SELECT nome, SUM(quantidade) FROM produto INNER JOIN vendaproduto ON produto.idproduto = vendaproduto.idproduto GROUP BY nome. If it’s not that, send more details to make it easier for the community to help you :)

1 answer

3


Translating the tables Produto and venda_Produto from its model to PgSQL:

CREATE TABLE Produto
(
    idproduto INTEGER NOT NULL,
    nome VARCHAR(60) NOT NULL,
    PRIMARY KEY ( idproduto )
);

CREATE TABLE venda_Produto
(
    idvenda INTEGER NOT NULL,
    idproduto INTEGER NOT NULL,
    quantidade INTEGER NOT NULL,
    PRIMARY KEY ( idvenda, idproduto ),
    FOREIGN KEY (idproduto) REFERENCES Produto (idproduto)
);

Registering Products:

INSERT INTO Produto ( idproduto, nome ) VALUES ( 100, 'Prego' );
INSERT INTO Produto ( idproduto, nome ) VALUES ( 200, 'Parafuso' );
INSERT INTO Produto ( idproduto, nome ) VALUES ( 300, 'Chave de Fenda' );

Registering Sales:

INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 1, 100, 1 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 2, 100, 4 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 3, 100, 1 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 4, 200, 3 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 5, 200, 1 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 6, 200, 3 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 7, 300, 5 );
INSERT INTO venda_Produto ( idvenda, idproduto, quantidade ) VALUES ( 8, 300, 5 );

To determine which product was the most sold, you can combine the aggregation function SUM() with the clauses ORDER BY and LIMIT, look at you:

SELECT
  idproduto,
  sum(quantidade) AS qtd_total
FROM
  venda_Produto
GROUP BY
  idproduto
ORDER BY
  qtd_total DESC
LIMIT
  1;

Exit:

| idproduto | qtd_total |
|-----------|-----------|
|       300 |        10 |

Now including the JOIN with the table of Produtos:

SELECT
  vp.idproduto,
  p.nome,
  sum(vp.quantidade) AS qtd_total
FROM
  venda_Produto AS vp
JOIN
  Produto AS p ON ( p.idproduto = vp.idproduto )
GROUP BY
  vp.idproduto,
  p.nome
ORDER BY
  qtd_total DESC
LIMIT
  1;

Exit:

| idproduto |           nome | qtd_total |
|-----------|----------------|-----------|
|       300 | Chave de Fenda |        10 |

Sqlfiddle

Browser other questions tagged

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