1
resposta

Dúvida referente a uma consulta em uma view com diferentes tabelas .

Boa tarde ,

Estou numa duvida referente a uma consulta de uma view que estou criando. Por exemplo eu tenho uma View com algumas tabelas relacionadas

Tenho a Coluna OrcID da tabela Orcamento e SeqID da tabela SequenciaOrcamento, OrcId= "Id Orcamento" e SeqId = "Sequencia ID" seria novas versoes do orcamento, porem nesta minha view, eu tenho que buscar sempre a ultima view do orcamento ... por exemplo o orcamento 2 eu tenho 4 sequencias e na minha view eu tenho que pegar sempre a ultima sequencia. Como proceder ?

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Este é o codigo da View

[dbo].[Vw_AcompanhamentoComercial]
AS
SELECT         dbo.TbOrcamento.OrcId AS 'OrcId', dbo.TbSequenciaOrcamento.SeqOrcNum AS 'SeqID', dbo.TbOrcamento.CliId AS 'Cod Cliente', dbo.TbCliente.CliNomeRazaoSocial AS 'Razao Social', 
                         dbo.TbOrcamento.PrsId AS 'Cod Prospect', dbo.TbProspect.PrsNomeRazaoSocial AS 'Nome Prospect', dbo.TbForecast.FcDescr AS 'Forecast', dbo.TbOrcamento.OrcStatusDescr AS 'Status Orcamento', 
                         dbo.TbOrcamento.OrcDataHoraIncl AS 'Data Inclusao', dbo.TbOrcamento.OrcDataHoraAprovReprov AS 'Data Aprovação', dbo.TbSequenciaOrcamento.SeqOrcAprovada AS 'Sequencia Aprovada', 
                         dbo.TbSequenciaOrcamento.SeqOrcValorTotal AS 'Valor Total', dbo.TbRepresentante.ReprNomeRazaoSocial AS 'Representante', 
                         (CASE tbempresa.empid WHEN 1 THEN 'BASS' WHEN 4 THEN 'BASS TECH' WHEN 5 THEN 'BASSANI' WHEN 6 THEN 'BASS ITATINGA' ELSE 'Não Definido' END) AS Empresa
FROM            dbo.TbOrcamento FULL OUTER JOIN
                         dbo.TbSequenciaOrcamento ON dbo.TbOrcamento.OrcId = dbo.TbSequenciaOrcamento.OrcId FULL OUTER JOIN
                         dbo.TbCliente ON dbo.TbOrcamento.CliId = dbo.TbCliente.CliId LEFT OUTER JOIN
                         dbo.TbProspect ON dbo.TbOrcamento.PrsId = dbo.TbProspect.PrsId INNER JOIN
                         dbo.TbRepresentanteSequenciaOrcamento ON dbo.TbSequenciaOrcamento.SeqOrcId = dbo.TbRepresentanteSequenciaOrcamento.SeqOrcId INNER JOIN
                         dbo.TbRepresentante ON dbo.TbRepresentanteSequenciaOrcamento.ReprId = dbo.TbRepresentante.ReprId LEFT OUTER JOIN
                         dbo.TbForecast ON dbo.TbOrcamento.FcId = dbo.TbForecast.FcId INNER JOIN
                         dbo.TbEmpresa ON dbo.TbOrcamento.EmpId = dbo.TbEmpresa.EmpId
GO
1 resposta

Oi, Charles! Tudo certo por aí?

Peço desculpas pela demora em te responder.

Para buscar sempre a última sequência de cada orçamento, podemos utilizar um filtro que coleta o valor máximo de SeqOrcNum tendo como base cada tipo de orçamento, por meio de um WHERE aninhado:

WHERE
SequenciaOrcamento.SeqOrcNum = (
    SELECT MAX(SeqOrcNum)
    FROM dbo.TbSequenciaOrcamento
    WHERE OrcId = Orcamento.OrcId
);

Inicialmente, estamos pegando SequenciaOrcamento.SeqOrcNum e filtrando o valor máximo de SeqOrcNum. No entanto, como queremos pegar a última sequência de cada orçamento, criamos um novo WHERE sobre TbSequenciaOrcamento filtrando os valores de OrcId de Orcamento.OrcId. Dessa forma, conseguiremos quebrar o valor máximo obtido inicialmente em vários outros, permitindo a obtenção das sequências mais recentes de cada orçamento.

Charles, caso queira ver o resultado final do SELECT que irá compor a view Vw_AcompanhamentoComercial, aqui está:

SELECT
    Orcamento.OrcId AS 'OrcId',
    SequenciaOrcamento.SeqOrcNum AS 'SeqID',
    Orcamento.CliId AS 'Cod Cliente',
    Cliente.CliNomeRazaoSocial AS 'Razao Social',
    Orcamento.PrsId AS 'Cod Prospect',
    Prospect.PrsNomeRazaoSocial AS 'Nome Prospect',
    Forecast.FcDescr AS 'Forecast',
    Orcamento.OrcStatusDescr AS 'Status Orcamento',
    Orcamento.OrcDataHoraIncl AS 'Data Inclusao',
    Orcamento.OrcDataHoraAprovReprov AS 'Data Aprovação',
    SequenciaOrcamento.SeqOrcAprovada AS 'Sequencia Aprovada',
    SequenciaOrcamento.SeqOrcValorTotal AS 'Valor Total',
    Representante.ReprNomeRazaoSocial AS 'Representante',
    (CASE Empresa.EmpId WHEN 1 THEN 'BASS' WHEN 4 THEN 'BASS TECH' WHEN 5 THEN 'BASSANI' WHEN 6 THEN 'BASS ITATINGA' ELSE 'Não Definido' END) AS Empresa
FROM
    dbo.TbOrcamento AS Orcamento
    INNER JOIN dbo.TbSequenciaOrcamento AS SequenciaOrcamento ON Orcamento.OrcId = SequenciaOrcamento.OrcId
    INNER JOIN dbo.TbCliente AS Cliente ON Orcamento.CliId = Cliente.CliId
    LEFT JOIN dbo.TbProspect AS Prospect ON Orcamento.PrsId = Prospect.PrsId
    INNER JOIN dbo.TbRepresentanteSequenciaOrcamento AS RepSeqOrc ON SequenciaOrcamento.SeqOrcId = RepSeqOrc.SeqOrcId
    INNER JOIN dbo.TbRepresentante AS Representante ON RepSeqOrc.ReprId = Representante.ReprId
    LEFT JOIN dbo.TbForecast AS Forecast ON Orcamento.FcId = Forecast.FcId
    INNER JOIN dbo.TbEmpresa AS Empresa ON Orcamento.EmpId = Empresa.EmpId
WHERE
    SequenciaOrcamento.SeqOrcNum = (
        SELECT MAX(SeqOrcNum)
        FROM dbo.TbSequenciaOrcamento
        WHERE OrcId = Orcamento.OrcId
    );

Espero ter ajudado! Contudo, vale ressaltar que como é um assunto externo aos cursos da Alura e que não tenho acesso ao cenário completo do projeto, outros testes terão de ser feitos a fim de obter o resultado esperado, mas espero que esta resposta seja um bom ponto de partida para a resolução do seu problema.

Fico à disposição em caso de dúvidas.

Abraço.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!