ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

join no sql server duvidas

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
valmirluis42
Novato
Novato


Registrado: Segunda-Feira, 17 de Agosto de 2015
Mensagens: 60

MensagemEnviada: Qua Nov 28, 2018 5:31 pm    Assunto: join no sql server duvidas Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qua Nov 28, 2018 7:50 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
valmirluis42
Novato
Novato


Registrado: Segunda-Feira, 17 de Agosto de 2015
Mensagens: 60

MensagemEnviada: Qua Nov 28, 2018 11:05 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Nov 29, 2018 9:45 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
valmirluis42
Novato
Novato


Registrado: Segunda-Feira, 17 de Agosto de 2015
Mensagens: 60

MensagemEnviada: Qui Nov 29, 2018 11:33 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Nov 29, 2018 5:00 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
valmirluis42
Novato
Novato


Registrado: Segunda-Feira, 17 de Agosto de 2015
Mensagens: 60

MensagemEnviada: Qui Nov 29, 2018 5:21 pm    Assunto: Responder com Citação

Manter dessa forma Imex,
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
imex
Moderador
Moderador


Registrado: Sexta-Feira, 7 de Janeiro de 2011
Mensagens: 11666

MensagemEnviada: Qui Nov 29, 2018 6:59 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
valmirluis42
Novato
Novato


Registrado: Segunda-Feira, 17 de Agosto de 2015
Mensagens: 60

MensagemEnviada: Sex Nov 30, 2018 11:19 am    Assunto: Responder com Citação

Ajudou sim, Muito Obrigado Imex
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Banco de Dados Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB