Jump to content

Recommended Posts

Posted (edited)

Bom dia,

Tenho aqui umas tabelas onde queria fazer umas consultas, mas nao estou a conseguir chegar ao resultado pretendido, as tabelas são as seguintas:

Produto( id_produto:INT, nome:VARCHAR(40) NN, tipo:VARCHAR(10), preco_atual:NUMERIC(5,2) NN, unidades_vendidas:NUMERIC(7) NN)

Cliente( id_cliente:INT, nome:VARCHAR(45), NIF:NUMERIC(9), morada:VARCHAR(45), codigo_postal:CHAR(8),cidade:VARCHAR(45))

Venda(id_venda:INT, data:DATE NN, tipo_pagamento:CHAR NN, id_cliente:int (fk))

Item(id_produto:INT (fk),id_venda:INT (fk),quantidade:NUMERIC(2) NN,preco_unitario:NUMERIC(5,2) NN,
desconto:NUMERIC(2))

Sendo os id's primary key.

E queria obter o nome do produto que mais unidades vendeu em 2012 e a quantidade vendida. Conseguem dar uma ideia como la chegar? Já fiz umas tentativas mas sem sucesso.

Obrigado pela atenção,

alves077

Edited by apocsantos
geshi
Posted

Primeiro passo

select produto.nome, sum(item.quantidade)
from ...
where ...
group by produto.nome

Segundo passo

Preciso de que tabelas?

select Produto.nome, sum(Item.quantidade)
from Produto, Venda, Item
where ...
group by produto.nome

Terceiro passo

Como se ligam as tabelas?

select Produto.nome, sum(Item.quantidade)
from Produto, Venda, Item
where Produto.id_produto = Item.id_produto and Item.id_venda = Venda.id_venda
group by produto.nome

Quarto passo

Limitar o resultado para o ano de 2012

select Produto.nome, sum(Item.quantidade)
from Produto, Venda, Item
where Produto.id_produto = Item.id_produto and Item.id_venda = Venda.id_venda
 and year(Venda.data) = 2012 -- nao sei se isto funciona em Oracle!
group by produto.nome

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Ok, obrigado pela explicação, mas esse select selecciona o produto que vendeu mais? Ou relaciona somente os produtos vendidos em 2012, mostrando a soma dos produtos vendido em 2012 produto a produto?

Não terei que usar uma sub-consulta para saber qual foi que vendeu mais, ou basta usar a função max no where, mas não sei se posso fazer.

Obrigado pela ajuda,

alves077

Posted (edited)

... esse select selecciona o produto que vendeu mais?

Ah! Esqueci-me dessa parte.

Se ordenares, por ordem decrescente, a segunda coluna, tens em primeiro lugar o produto que vendeu mais.

Como seleccionar so um registo no Oracle, nao sei ...

-- MSSQL
SELECT TOP 1 Produto.nome, SUM(Item.quantidade)
FROM Produto, Venda, Item
WHERE Produto.id_produto = Item.id_produto AND Item.id_venda = Venda.id_venda
 AND YEAR(Venda.DATA) = 2012 -- nao sei se isto funciona em Oracle!
GROUP BY produto.nome
order by sum(item.quantidade) desc

-- MySQL
SELECT Produto.nome, SUM(Item.quantidade)
FROM Produto, Venda, Item
WHERE Produto.id_produto = Item.id_produto AND Item.id_venda = Venda.id_venda
 AND YEAR(Venda.DATA) = 2012 -- nao sei se isto funciona em Oracle!
GROUP BY produto.nome
order by sum(item.quantidade) desc
limit 1
Edited by pmg

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Ok, obrigado.

Se puderes ajudar só mais num exercício com as mesmas tabelas agradecia:

Calcular o desconto total oferecido em cada produto em 2012, isto é, a quantia total descontada em todas as unidades vendidas de cada produto ao longo do ano de 2012. Apresentar também o total ganho em vendas e ordenar o resultado final por desconto total.

Estava a fazer este com um sub consulta, mas sem sucesso...

Obrigado pela atenção,

alves077

Posted (edited)
Select produto.nome, sum((item.desconto/100)*item.preco_unitario) "Desconto Total",  sum( item.preco_unitario-((item.desconto/100)*item.preco_unitario)) "Total despendido"
From produto, item, venda
Where produto.id_produto=item.id_produto AND item.id_venda=venda.id_venda AND YEAR(venda.data) = 2012

Esquece a parte da sub consulta, tentei fazer de outra maneira, não sei se esta muito legível e acho que está mal, a logica calculo com o sum o desconto de cada produto de 2012, e o total despendido calculo o preço a pagar - o desconto..

Obrigado pela atenção,

alves077

Edited by alves077
Posted

Se tens colunas simples e colunas com SUM()s, tens que agrupar os resultados!

select ... sum() ...
...
group by ...

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Posted

Não sei se faço bom uso do group by, mas penso ser +/- ist

Select produto.nome, sum((item.desconto/100)*item.preco_unitario) "Desconto Total",  sum( item.preco_unitario-((item.desconto/100)*item.preco_unitario)) "Total despendido"
From produto, item, venda
Where produto.id_produto=item.id_produto AND item.id_venda=venda.id_venda 
Group by produto.nome
having  YEAR(venda.data) = 2012

Obrigado pela atenção,

alves077

  • 3 weeks later...
  • 2 months later...
Posted

se a coluna venda.DATA é do tipo DATE penso que o HAVING YEAR(venda.DATA) = 2012 poderá ser apenas maisuma cláusula de where: AND to_char(venda.DATA,'YYYY') = '2012' e o limit pode ser também mais uma cláusula de where: AND rownum = 1"

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.