Select bestsellers in related table

Asked

Viewed 326 times

1

I have a table pedidos, produtos and another produtos_em_pedidos described as follows:

produtos: id | nome
pedidos: id | data
produtos_em_pedidos: produto_id | pedido_id | quantidade

I need to select the products that occur most in orders, being able to filter by date.

An example I already obtained was to find the best selling products globally, without considering the quantity column, through the query:

select produto_id, count(produto_id) from produtos_em_pedidos group by produto_id order by count(produto_id) desc

Now how would I filter that by the date that’s on the table pedidos (ex: WHERE data > 2015-01-01) and how to multiply Count by column quantidade?

EDIT: I was able to filter by dates through the following query:

SELECT produto_id, count(produto_id) FROM produtos_em_pedidos
WHERE pedido_id in (select id from pedidos where data > '2015-01-01')
AND pedido_id in (select id from pedidos where data < '2018-01-01')
GROUP BY produto_id
order by count(produto_id) DESC;
  • It is an option, another good would be to use a Join between the two tables and use the data as desired: Select count(pep.produto_id) from produtos_em_pedidos pep join pedidos on(pep.pedido_id = pedidos.id and pedidos.data < '2018-01-01' ) group by produto_id order by count(pep.produto_id) , Sort of like this.

  • And how I would consider the column quantidade in Count?

  • The Inner Join only takes the records that "match" with the condition, so giving a Count() it will count the records that fit

  • The end result was the same. But this form you gave me seems much more computationally effective. Thank you!

  • Oops, I’m glad you helped. Dispose.

1 answer

0


Now how would I filter this by the date that is on the orders table (ex: WHERE data > 2015-01-01)?

For this just do the Join with the table that has the date and check the condition in the clause Where, as follows:

select produto_id, count(produto_id) as num_produto from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01' group by produto_id;

and how to multiply Count by the quantity column?

In this case you won’t get it with just a query because the query will require the aggregation of the quantity column to group by. To be able to bring the information you need, you will need a subquery for each aggregation function. To recover the quantity of products first, the following query can be used:

select produto_id, count(produto_id) as num_produto from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01' group by produto_id

To get the order quantity, the following query can be used:

select sum(quantidade) as total, produto_id from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01'  group by produto_id

Joining both you will get the information you want. The final query would be:

select vendas.produto_id, num_produto * total from (select produto_id, count(produto_id) as num_produto from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01' group by produto_id) vendas join (select sum(quantidade) as total, produto_id from produtos_em_pedidos join pedidos on (id = produto_id) where data > '2015-01-01'  group by produto_id) quantidades using (produto_id) order by num_produto desc;

See some tests I ran to evaluate the elaborate query: inserir a descrição da imagem aqui

Browser other questions tagged

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