GARANTIR DESCONTO

Fórum sql fácil, mais não dei conta de fazer... #48035

13/11/2004

0

Tenho as seguintes tabelas:

CREATE TABLE ´VENDA´
(
´IDVENDA´INTEGER NOT NULL,
´VALOR´NUMERIC(10, 2),
´DATA´DATE,
´HORA´TIME,
´FORMAPAGTO´INTEGER,
´CLIENTE´INTEGER,
´USUARIO´VARCHAR(10),
PRIMARY KEY (´IDVENDA´)
);

CREATE TABLE ´SECAO´
(
´IDSECAO´INTEGER NOT NULL,
´SDESCRICAO´VARCHAR(20),
PRIMARY KEY (´IDSECAO´)
);

CREATE TABLE ´PRODUTOS´
(
´CODBARRA´VARCHAR(13) NOT NULL,
´DESCRICAO´VARCHAR(30),
´FORNECEDOR´INTEGER,
´PRECOVENDA´NUMERIC(10, 2),
´PRECOCUSTO´NUMERIC(10, 2),
´ESTOQUE´NUMERIC(10, 3),
´ESTOQUEMIN´NUMERIC(10, 3),
´ESTOQUEMAX´NUMERIC(10, 3),
´SECAO´INTEGER,
PRIMARY KEY (´CODBARRA´)
);

CREATE TABLE ´PRODVENDA´
(
´IDPRODVENDA´INTEGER NOT NULL,
´PVENDA´INTEGER,
´PVCODBARRA´VARCHAR(13),
´PVFORNECEDOR´INTEGER,
´PVCUSTO´NUMERIC(10, 2),
´PVVENDA´NUMERIC(10, 2),
´PVTOTAL´NUMERIC(10, 2),
´PVSECAO´INTEGER,
´PVQUANTIDADE´NUMERIC(10, 3),
´PVCUSTOTOTAL´NUMERIC(10, 2),
PRIMARY KEY (´IDPRODVENDA´)
);

Preciso retornar as quantidades vendidas de cada produto num determinado período, ex:

De 1/10 a 15/10
produto quantidade custo unitario
banana 15k 0,50
.
.
.
montei a seguinte instrução:

select m.descricao, p.pvquantidade, p.pvcusto from produtos m
inner join prodvenda p on m.codbarra = p.pvcodbarra
inner join venda v on v.idvenda = p.pvenda
inner join secao s on s.idsecao = p.pvsecao
where s.sdescricao = ´FRIOS´ and v.data between ´07/10/2004´ and ´10/10/2004´

mas não dá certo, ou traz todos os resultados ou não devolve nada. E tem mais, eu ainda nem consegui fazer com que ele não duplique os produtos com a clausula DISTINCT...

Preciso de vocês

Qualquer ajuda é bem vinda

Ps. Utilizo o interbase 6 e delphi 6
Obrigado pela atenção

Sanses


Sanses

Sanses

Responder

Posts

13/11/2004

Aroldo Zanela

Colega,

Basicamente:

select codbarras, sum(qtde) as qt_produto
from vendas
where data between :inicio and :fim
group by codbarras



Responder

Gostei + 0

13/11/2004

Sanses

Obrigado pela atenção A. Zanela, mas tem um problema, na instrução que vc me passou o campo codbarras não está na tabela vendas e sim na prodvendas, então tenho que relaciona-las com inner join. Outra coisa a data da venda sim esta na tabela venda e esta tem que ser levada em conta no relatório. Outro inner join seria para unir a tabela seção, pois o relatório deve sair separado por seções e no caso o campo da tabela prodvenda é integer apontando para a tabela seção. O ultimo inner join seria para que no campo codbarra do relatório saisse a descrição do produto e não o codigo de barras, uma vez que na tabela prodvenda só gravo o codigo de barras do produto e não sua descrição.

É meio confuso não sei se consegui explicar direito, mas é isso que preciso, visto que não tenho como alterar o banco de dados, por causa da grande quantidade de registros.

Obrigado mais uma vez pela atenção
Sanses


Responder

Gostei + 0

13/11/2004

Aroldo Zanela

Colega,

A minha idéia foi apenas para ilustrar o uso de agrupamentos (group by) com agregação (sum). No caso, basta fazer os relacionamentos (joins) que você precisa que deverá funcionar.


Responder

Gostei + 0

14/11/2004

Sanses

ok entendi, mas veja, mesmo assim não está retornando so os valores entre as datas especificadas:
select m.descricao, sum(p.pvquantidade) as q from produtos m
inner join prodvenda p on m.codbarra = p.pvcodbarra
inner join venda v on v.idvenda = p.pvenda
inner join secao s on s.idsecao = p.pvsecao
where s.sdescricao = ´FRIOS´ and v.data between ´09/10/2004´ and ´10/10/2004´
[b]group by m.descricao[/b]

Desta forma, ou retorna tudo o que tem no banco, e não só os valores entre o período passado.
Minha pergunta é, esta instrução está correta?


Responder

Gostei + 0

14/11/2004

Aroldo Zanela

Colega,

Aparentemente está correto. Vamos aguardar o parecer de outros colegas mais experiente com Interbase, pois nunca o utilizei e minha solução basea-se de acordo com o padrão ANSI e que não há problemas de cardinalidades entre as tabelas que resultem num produto cartesiano, ou seja, não há erro de modelagem de dados.


Responder

Gostei + 0

14/11/2004

Sanses

é, obrigado mais uma vez pela atenção.

A instrução funciona corretamente, mas se não fizer a especificação das datas. Talvez os colegas possam ajudar a exclarecer, pois a meu ver está correto, porém não funciona. Já tentei de outras formas, mas não funcionou, esta acima foi a que chegou mais perto do rsultado que preciso.

Fico aguardando a ajuda de voces.
Obrigado
Sanses


Responder

Gostei + 0

14/11/2004

Gandalf.nho

Não esqueça que no IB/FB se você usar datas de forma literal na SQL, você deve passar a data no formato mm/dd/aaaa e não dd/mm/aaaa.
Para melhor evitar esse problema parametrize a query.


Responder

Gostei + 0

15/11/2004

Sanses

BINGO!

Obrigado pela atenção de todos, mas o amigo gandalf.nho tinha razão, foi só parametrizar a query que funcionou. Valew :D


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar