 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
valmirluis42 Novato

Registrado: Segunda-Feira, 17 de Agosto de 2015 Mensagens: 60
|
Enviada: Qua Nov 28, 2018 5:31 pm Assunto: join no sql server duvidas |
|
|
Boa noite, estou com o seguinte problema:
tenho um select que são de produtos que são vindos dessa tabela:
| Código: | | select codigomaterial,codigoauxiliar,DESCRICAO from cadmaterial |
o que preciso é que ele retorne a ultima entrada do fornecedor e a quantidade que estão nessas tabelas :
| Código: | | select numero,codigoparceiro from MOVIMENTOFISCAL where TIPOOPERACAO='E' |
essa tabela faz o join com o campo NUMERO com a NUMEROMOVIMENTO
dessa tabela
| Código: | | select NUMEROMOVIMENTO,CODIGOALMOXARIFADO, ordemmovimento from MOVIMENTO where serienota='NF ENTRADA' |
que faz o join com essa tabela, através do campo ORDEMMOVIMENTO com o ORDEMMOVIMENTO da tabela :
| Código: | | select ordemmovimento,codigomaterial,data,quantidade From movimentoitem |
esses joins precisam mostrar o ultimo fornecedor, que seria um top 1 para depois unir com o primeiro select que postei. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qua Nov 28, 2018 7:50 pm Assunto: |
|
|
Boa noite,
Qual versão do SQL Server você está utilizando?
Qual campo de qual tabela deve ser utilizado para identificar qual é a última entrada?
Você quer a última entrada de cada produto? Ou de um determinado fornecedor? Se é de um fornecedor, qual campo indica o fornecedor nessas tabelas?
Editado pela última vez por imex em Dom Out 01, 2023 4:32 pm, num total de 1 vez |
|
| Voltar ao Topo |
|
 |
valmirluis42 Novato

Registrado: Segunda-Feira, 17 de Agosto de 2015 Mensagens: 60
|
Enviada: Qua Nov 28, 2018 11:05 pm Assunto: |
|
|
Qual versão do SQL Server você está utilizando? R- 2014
Qual campo de qual tabela deve ser utilizado para identificar qual é a última entrada? - Data (select ordemmovimento,codigomaterial,data,quantidade From movimentoitem)
Você quer a última entrada de cada produto? Ou de um determinado fornecedor? Se é de um fornecedor, qual campo indica o fornecedor nessas tabelas? Como já vai ter a data , o fornecedor é so pelo ID que é o campo codigoparceiro |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Nov 29, 2018 9:45 am Assunto: |
|
|
Tenho algumas dúvidas sobre o resultado que você quer obter mas experimente fazer uns testes com a query abaixo para ver se é obtido o resultado esperado:
| Código: | select
p.codigomaterial,
p.codigoauxiliar,
p.descricao,
ca.ordemmovimento,
ca.data,
ca.quantidade
from cadmaterial as p
cross apply
(
select top(1)
i.ordemmovimento,
i.data,
i.quantidade
from movimentoitem as i
inner join MOVIMENTO as m
on m.ordemmovimento = i.ordemmovimento
inner join MOVIMENTOFISCAL as f
on f.NUMERO = m.NUMEROMOVIMENTO
where
i.codigomaterial = p.codigomaterial and
m.serienota = 'NF ENTRADA' and
f.TIPOOPERACAO = 'E'
order by
i.data desc
) as ca |
Espero que ajude |
|
| Voltar ao Topo |
|
 |
valmirluis42 Novato

Registrado: Segunda-Feira, 17 de Agosto de 2015 Mensagens: 60
|
Enviada: Qui Nov 29, 2018 11:33 am Assunto: |
|
|
Funcionou Imex, exatamente como esperado . Só que surgiu outra demanda que é colocar esses campos dentro de outro select.
Esse Select que você criou:
| Código: | select
p.codigomaterial,
p.codigoauxiliar,
p.descricao,
ca.ordemmovimento,
ca.data,
ca.quantidade,
ca.codigoparceiro
from cadmaterial as p
cross apply
(
select top(1)
i.ordemmovimento,
i.data,
i.quantidade ,
f.CODIGOPARCEIRO
from movimentoitem as i
inner join MOVIMENTO as m
on m.ordemmovimento = i.ordemmovimento
inner join MOVIMENTOFISCAL as f
on f.NUMERO = m.NUMEROMOVIMENTO
where
i.codigomaterial = p.codigomaterial and
m.serienota = 'NF ENTRADA' and
f.TIPOOPERACAO = 'E'
order by
i.data desc
) as ca |
junto com esse:
| Código: |
with CTE_Pivot as ( select CODIGOMATERIAL, [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] from
(select MONTH(DATA) as MES, i.Quantidade, i.CODIGOMATERIAL from MOVIMENTOITEM I where
i.DATA >= '01-06-2018' and i.DATA <= '31-10-2018' and i.CODIGOTABELAPRECO in ('01001','01002','01003','01004')AND I.SISTEMAORIGEM='BAL' and i.codigomaterial like '9901%' ) as t pivot (sum(Quantidade) for MES in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12] )
) as p ) select c.codigomaterial, L.CODIGOAUXILIAR, L.DESCRICAO, c.[1],c.[2],c.[3],c.[4],c.[5],c.[6],c.[7],c.[8],c.[9],c.[10],c.[11],c.[12]
from CTE_Pivot as c INNER JOIN CADMATERIAL L ON (c.CODIGOMATERIAL = L.CODIGOMATERIAL) |
os campos do resultado do select que você criou já tem alguns nesse acima como : CODIGOMATERIAL, codigoauxiliar e Descrição. Só que nesse que a informação ficará completa com aqueles campos da data da ultima entrada (data), a quantidade da ultima entrada e o codigo do parceiro que estão no que você criou acima. |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Nov 29, 2018 5:00 pm Assunto: |
|
|
| Nessa outra query existem vários filtros que não existem nessa outra query da última entrada. O objetivo é manter dessa forma mesmo ou adicionar alguns filtros nessa query da última entrada também? Se vai adicionar, quais? |
|
| Voltar ao Topo |
|
 |
valmirluis42 Novato

Registrado: Segunda-Feira, 17 de Agosto de 2015 Mensagens: 60
|
Enviada: Qui Nov 29, 2018 5:21 pm Assunto: |
|
|
| Manter dessa forma Imex, |
|
| Voltar ao Topo |
|
 |
imex Moderador

Registrado: Sexta-Feira, 7 de Janeiro de 2011 Mensagens: 11666
|
Enviada: Qui Nov 29, 2018 6:59 pm Assunto: |
|
|
Experimente fazer uns testes dessa forma:
| Código: | with CTE_Pivot as
(
select CODIGOMATERIAL, [1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]
from
(
select MONTH(DATA) as MES, i.Quantidade, i.CODIGOMATERIAL
from MOVIMENTOITEM I
where
i.DATA >= '01-06-2018' and
i.DATA <= '31-10-2018' and
i.CODIGOTABELAPRECO in ('01001','01002','01003','01004') AND
I.SISTEMAORIGEM = 'BAL' and
i.codigomaterial like '9901%'
) as t
pivot
(
sum(Quantidade) for MES in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) as p
)
select
c.codigomaterial,
L.CODIGOAUXILIAR,
L.DESCRICAO,
ca.ordemmovimento,
ca.data,
ca.quantidade,
ca.codigoparceiro,
c.[1],c.[2],c.[3],c.[4],c.[5],c.[6],c.[7],c.[8],c.[9],c.[10],c.[11],c.[12]
from CTE_Pivot as c
INNER JOIN CADMATERIAL L
ON c.CODIGOMATERIAL = L.CODIGOMATERIAL
cross apply
(
select top(1)
i.ordemmovimento,
i.data,
i.quantidade ,
f.CODIGOPARCEIRO
from movimentoitem as i
inner join MOVIMENTO as m
on m.ordemmovimento = i.ordemmovimento
inner join MOVIMENTOFISCAL as f
on f.NUMERO = m.NUMEROMOVIMENTO
where
i.codigomaterial = L.codigomaterial and
m.serienota = 'NF ENTRADA' and
f.TIPOOPERACAO = 'E'
order by
i.data desc
) as ca |
Espero que ajude |
|
| Voltar ao Topo |
|
 |
valmirluis42 Novato

Registrado: Segunda-Feira, 17 de Agosto de 2015 Mensagens: 60
|
Enviada: Sex Nov 30, 2018 11:19 am Assunto: |
|
|
| Ajudou sim, Muito Obrigado Imex |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|