Fórum sql fácil, mais não dei conta de fazer... #48035
13/11/2004
0
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
Curtir tópico
+ 0Posts
13/11/2004
Aroldo Zanela
Basicamente:
select codbarras, sum(qtde) as qt_produto from vendas where data between :inicio and :fim group by codbarras
Gostei + 0
13/11/2004
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
13/11/2004
Aroldo Zanela
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
14/11/2004
Sanses
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
14/11/2004
Aroldo Zanela
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
14/11/2004
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
14/11/2004
Gandalf.nho
Para melhor evitar esse problema parametrize a query.
Gostei + 0
15/11/2004
Sanses
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
Clique aqui para fazer login e interagir na Comunidade :)