Join entre 2 tabelas com filtros

08/01/2016

8

Bom dia. Tenho 2 tabelas, uma de ítens e outra de pedidos. Estou precisando fazer um filtro na tabela de ítens de pedido. Os parâmetros a serem passados são data inicial e final (campo PEDIDOS.DTPEDIDO) e status (campo PEDIDOS.STATUSPEDIDO) da tabela pedidos. Estes dados não existem na tabela de ítens do pedido (PEDIDOITENS). Na tabela tabela de ítens do pedido o único dado que tenho que vincula as duas tabelas é o número do pedido (PEDIDOITENS.NRPEDIDO). Não tem data nem status. Fiz a consulta utilizando um clientdataset e funcionou perfeitamente apenas para os pedidos. Como posso fazer um join entre essas tabelas filtrando por data inicial e final e status da tabela pedido?

Obs.: Utilizo Delphi 7 e Firebird 2.5.

Tabela PEDIDOS
CODPEDIDO
DTPEDIDO
STATUS

Tabela PEDIDOITENS
NRPEDIDO
CODPEDIDO
DESCRICAO
QTVENDA
VALPRODUTO
PEDIDOITENS.VALPEDIDO
Responder

Post mais votado

08/01/2016

Segue a query

Creio que houve um erro na modelagem do banco de dados, ou está faltando alguma tabela que faça o "meio de campo" entre essas duas.

Pelo que vejo o jeito certo dessa query seria na tabela pedidos ter o codpedido e o codpedido na tabela pedidoitens ser FK


query para o procedimento certo
SELECT
*
FROM
PEDIDOS AS PEDIDOS
LEF JOIN PEDIDOITENS AS ITENS ON PEDIDOS.CODPEDIDO = ITENS.CODPEDIDO
WHERE
PEDIDOS.DTPEDIDO BETWEEN '2015-01-01' AND '2015-01-01 23:59:59'
Responder

Mais Posts

Olá cavalcanti.
Não sei o que está usando para fazer a consulta, mas você pode montar uma query com join e na cláusula where você aplica os filtros.
Ex:
select i.* /* (aqui estou pegando todos os itens, pois imagino que você queira saber quais itens têm em cada pedido) */
from pedidos as P
inner join pedidoitens as i on p.codpedido = i.codpedido
where p.dtpedido >= @data_inicial /* parâmetros*/
and p.dtpedido < @data_final + 1
and [status] = @status

Aonde @data_inicial , @data_final e @status são os parâmetros.

Como o amigo Din falou, se a codpedido não for PK na pedidos e FK na pedidoitens, creio que o MER do seu banco de dados está incorreto e compromete a integridade das informações.
Espero ter ajudado.
Responder
Obrigado pelo retorno Rafael Brandão e Din. Vou corrigir a estrutura da tabela de ítens do pedido, faço o teste e posto o resultado.
Responder
Boa noite Rafael e Din. Fiz as adequações nas tabelas conforme vocês indicaram. Primeiro tentei no componente TSQLQuery. Não dava mensagem de erro mas não aparecia nada no TDBGrid. Apliquei a instrução do Rafael em um TClientDataSet. Funcionou sem problemas.

Utilizei os seguintes componentes:
TDataSetProvider
TSQLQuery
TClientDataSet
TDataSource

Mais uma ajuda. No resultado da consulta aparece um campo do total do pedido. Caso queira somar o campo totalpedido aonde entraria a instrução SUM? Gostaria também que me indicassem uma apostila sobre SQL.
Responder

11/01/2016

Lucas Silva

o campo PEDIDOS.CODPEDIDO é equivalente ao PEDIDOSITENS.NRPEDIDO? Se sim
então é só você fazer assim:

select NRPEDIDO,
CODPEDIDO,
DTPEDIDO,
STATUS,
CODPEDIDO,
DESCRICAO,
QTVENDA,
VALPRODUTO
from pedidos p
left join pedidositens pi on pi.nrpedido = p.codpedido
where STATUS='ATIVO' and DTPEDIDO between '12/01/2015' and '12/31/2015'

sendo que você tem que colocar no lugar de ATIVO o status que você quer e no lugar das datas que eu coloquei você deve colocar a data inicial e final (no formato americano: mês/dia/ano) onde você que buscar.

Sobre o campo TOTALPEDIDO: Esse campo está na tabela de itens? Se sim essa é uma prática ruim, pois o TOTALPEDIDO refere-se ao pedido portanto deve constar na tabela pedido, além disso todos itens desse pedido teriam o mesmo valor e isso é redundância. Tá em qual tabela esse campo?

Qualquer outra dúvida pode falar comigo, Cavalcanti.
Responder
Bom dia Luca e obrigado pelo retorno.
O campo total dos pedidos fica na tabela pedidos.
O que preciso é o total dos pedidos entre as faixas de data que tenham o status FECHADO.
Responder

11/01/2016

Lucas Silva

se você rodar o seguinte SQL:

select sum(TOTALPEDIDO) from pedidos where DTPEDIDO between '12/01/2015' and '12/31/2015'


irá ser retornado a soma (sum) dos pedidos onde a data de pedido esteja entre (between) 01/12/2015 e 31/12/2015
Responder

11/01/2016

Lucas Silva

Me esqueci de colocar

and status='FECHADO'


no final do SQL, então o SQL completo seria:

select sum(TOTALPEDIDO) from pedidos where DTPEDIDO between '12/01/2015' and '12/31/2015' and status='FECHADO'
Responder
RESOLVIDO. Obrigado a todos. Como tinha dito anteriormente, após sugestões do Din e do Rafael Brandão, reparei a estrutura da tabela de ítens do pedido. Com relação a soma, fiz utilização do group by e obtive a soma de cada produto vendido em um seleção de data. Obrigado também ao Lucas pela atenção.
Responder

18/04/2017

Breno Viana

Oi amigo, bom tarde!

Bom, e se não existir a data solicitada no banco? como devo proceder ?
Responder