sql fácil, mais não dei conta de fazer...
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
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
Curtidas 0
Respostas
Aroldo Zanela
13/11/2004
Colega,
Basicamente:
Basicamente:
select codbarras, sum(qtde) as qt_produto from vendas where data between :inicio and :fim group by codbarras
GOSTEI 0
Sanses
13/11/2004
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
É 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
GOSTEI 0
Aroldo Zanela
13/11/2004
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.
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.
GOSTEI 0
Sanses
13/11/2004
ok entendi, mas veja, mesmo assim não está retornando so os valores entre as datas especificadas:
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?
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?
GOSTEI 0
Aroldo Zanela
13/11/2004
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.
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.
GOSTEI 0
Sanses
13/11/2004
é, 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
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
GOSTEI 0
Gandalf.nho
13/11/2004
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.
Para melhor evitar esse problema parametrize a query.
GOSTEI 0
Sanses
13/11/2004
BINGO!
Obrigado pela atenção de todos, mas o amigo gandalf.nho tinha razão, foi só parametrizar a query que funcionou. Valew :D
Obrigado pela atenção de todos, mas o amigo gandalf.nho tinha razão, foi só parametrizar a query que funcionou. Valew :D
GOSTEI 0