SQL - Agrupamento entre tabelas
23/10/2017
0
SELECT DISTINCT tbPatObrasPublicas.idObra, tbPatTiposObras.dsTipoObra AS [Tipo Obra], tbPatObrasPublicas.cdIntervencao AS [Cod. Itervenção], tbPatObrasPublicas.nrAno AS [Ano], tbPatObrasPublicas.nmObra [Nome da Obra], tbPatObrasPublicas.nrMedidaObra AS [Nr. Medida], tbPatObrasUnidadesMedidas.dsUnidadeMedida, tbPatObrasPublicas.vlEstimado AS [Valor Estimado], tbGerPessoas.nmPessoa, tbPatObrasPublicas.dtInicioObraReal [Data Inicio], tbPatObrasPublicas.nrDiasPrevConclusao [Prazo Exec], tbPatObrasPublicas.dtRefEstimado [Data Base Valor], tbPatObrasPublicasAcompanhamentos.dtMedicao, (SELECT tbPatObrasPublicasTiposAcompanhamentos.dsTipoAcompanhamento FROM tbPatObrasPublicasAcompanhamentos AS Acompanhamentos WHERE tbPatObrasPublicasAcompanhamentos.idObra = tbPatObrasPublicas.idObra AND Acompanhamentos.dtMedicao = tbPatObrasPublicasAcompanhamentos.dtMedicao ) AS [Situação], tbPatClassificacaoIntervencao.dsClassificacaoIntervencao AS [Tipo Intervenção], tbPatTiposRegimeIntervencao.dsTipoRegimeIntervencao, tbPatTiposIntervencao.dsTipoIntervencao [Classificação da Intervenção], DATEADD(day, nrDiasPrevConclusao, dtInicioObraReal) as [Data Estimada Término], (SELECT CASE WHEN tbPatObrasPublicas.cdFonteRecurso = 'P' THEN 'P - Próprio' WHEN tbPatObrasPublicas.cdFonteRecurso = 'O' THEN 'O - Operação de Crédito' END ) AS [Fonte Recurso], (SELECT ISNULL(SUM(nrPercFisico), 0) AS Expr1 FROM tbPatObrasPublicasAcompanhamentos AS Acompanhamentos WHERE (idObra = tbPatObrasPublicas.idObra) AND Acompanhamentos.idMotivoParalisacao IS NULL) AS 'Perc Concluido' --(SELECT isnull(SUM([nrPercFisico]),0) -- FROM [tbPatObrasPublicasAcompanhamentos] T -- WHERE T.idObra = tbPatObrasPublicasAcompanhamentos.idObra -- AND [idTipoAcompanhamento] = 1 -- -- AND T.dtMedicao < OA.dtMedicao -- AND T.nrAcompanhamento < tbPatObrasPublicasAcompanhamentos.nrAcompanhamento -- AND T.idTipoMedicao = tbPatObrasPublicasAcompanhamentos.idTipoMedicao -- AND (T.idContrato = tbPatObrasPublicasAcompanhamentos.idContrato OR T.idAtoAContratual = tbPatObrasPublicasAcompanhamentos.idAtoAContratual OR (T.idContrato IS NULL AND T.idAtoAContratual IS NULL)) -- ) + ISNULL(nrPercFisico,0) AS [(%) Executado até Acompanhamento] FROM tbPatObrasPublicas INNER JOIN tbPatObrasPublicasAcompanhamentos ON tbPatObrasPublicas.idObra = tbPatObrasPublicasAcompanhamentos.idObra INNER JOIN tbPatImoveis ON tbPatObrasPublicas.idBem = tbPatImoveis.idBem INNER JOIN tbGerLocalidades ON tbGerLocalidades.idLocalidade = tbPatImoveis.idLocalidade LEFT JOIN tbGerEnderecos ON tbGerLocalidades.idEndereco = tbGerEnderecos.IDEndereco LEFT JOIN tbGerBairros ON tbGerEnderecos.IDBairro = tbGerBairros.IDBairro LEFT JOIN tbPatBens ON tbPatImoveis.idBem = tbPatBens.idBem LEFT JOIN tbGerPessoas ON tbGerPessoas.idPessoa = tbPatObrasPublicasAcompanhamentos.idPessoaFiscal LEFT JOIN tbPatClassificacaoIntervencao ON tbPatClassificacaoIntervencao.idClassificacaoIntervencao = tbPatObrasPublicas.idClassificacaoIntervencao LEFT JOIN tbPatTiposRegimeIntervencao ON tbPatTiposRegimeIntervencao.idTipoRegimeIntervencao = tbPatObrasPublicas.idTipoRegimeIntervencao LEFT JOIN tbPatTiposIntervencao ON tbPatTiposIntervencao.idTipoIntervencao = tbPatObrasPublicas.idTipoIntervencao LEFT JOIN tbPatObrasPublicasTiposAcompanhamentos ON tbPatObrasPublicasTiposAcompanhamentos.idTipoAcompanhamento = tbPatObrasPublicasAcompanhamentos.idTipoAcompanhamento INNER JOIN tbPatTiposObras ON tbPatObrasPublicas.cdTipoObra = tbPatTiposObras.cdTipoObra INNER JOIN tbPatObrasUnidadesMedidas ON tbPatObrasPublicas.cdUnidadeMedida = tbPatObrasUnidadesMedidas.cdUnidadeMedida WHERE tbPatImoveis.idEmpresa = 1 AND (tbPatObrasPublicasAcompanhamentos.dtMedicao >= '01/01/2013' AND tbPatObrasPublicasAcompanhamentos.dtMedicao <= '01/01/2017') AND (tbPatObrasPublicas.idObra = 171 ) AND (tbPatObrasPublicas.nrAno = 2013 ) --AND (((select U.cdOrgaoOrcamento -- from tbGerServidores S INNER JOIN tbGerUnidades U ON U.idUnidade = S.idUnidade -- where S.dslogin LIKE @dsLogin ) -- IN (SELECT cdOrgaoOrcamento from tbGerUnidades WHERE idunidade = tbPatBens.idunidade ) AND tbPatBens.idBem IS NOT NULL) -- OR @dsLogin = '') AND EXISTS (SELECT 1 FROM tbPatObrasPublicasAcompanhamentos WHERE tbPatObrasPublicasAcompanhamentos.idObra = tbPatObrasPublicas.idObra ) AND tbPatObrasPublicasAcompanhamentos.dtMedicao = (SELECT MAX(tbPatObrasPublicasAcompanhamentos.dtMedicao) FROM tbPatObrasPublicasAcompanhamentos WHERE tbPatObrasPublicasAcompanhamentos.idObra = tbPatObrasPublicas.idObra)
Tenho essa query e precisava trazer a informação descrição do tipo de acompanhamento (tbPatObrasPublicasTiposAcompanhamentos.dsTipoAcompanhamento) com a maior data de medição (tbPatObrasPublicasAcompanhamentos.dtMedicao) que deve voltar apenas 1 registro por ele ser vinculado com a Obra (tbPatObrasPublicasAcompanhamentos.idObra = tbPatObrasPublicas.idObra) e o registro de dtMedicao ter registros iguais.
As tabelas e o campos são:
tbPatObrasPublicas (idObra)
tbPatObrasPublicasAcompanhamentos (idObra, IdAcompanhamento, dtMedicao, idTipoAcompanhamento)
tbPatObrasPublicasTiposAcompanhamentos (idTipoAcompanhamento, dsTipoAcompanhamento)
Cesar Paez
Post mais votado
24/10/2017
Essa sua query deveria retornar apenas um registro?
Eu não sei dizer o erro que vc está tendo, porque não tenho como ver o resultado da sua consulta.
Um erro comum que acontece com queries com muitos relacionamentos, é o relacionamento estar errado e o resultado retornar linhas duplicadas.
Eu começaria por ai.
Grande abraço
Luiz Santos
Mais Posts
24/10/2017
Chromusmaster
24/10/2017
Cesar Paez
24/10/2017
Luiz Santos
O erro está lá.
Você pode forçar um DISTINCT, mas é uma gambiarra, e não a forma correta de resolver o problema.
Provavlemente vc está esquecendo de passar algum atributo em um dos seus relacionamentos
29/11/2017
Joimar Franco
Definir Data xInicial_R316;
Definir Data xFinal_R316;
Definir Data xInicialA;
Definir Data xInicial;
Definir Numero xSitua;
MontaData (01, 12, 2017, xInicial_R316);
xDia_R316 = 0;
xMes_R316 = 0;
xAno_R316 = 0;
DesMontaData (xInicial_R316, xDia_R316, xMes_R316, xAno_R316);
xFinal_R316 = xInicial_R316;
UltimoDia (xFinal_R316);
MontaData (30, 12, 2017, xFinal_R316);
xAbandona_R316 = 0;
Definir Cursor Cur_R038AFA;
Cur_R038AFA.SQL "SELECT R038AFA.DATAFA \\\\
FROM R038AFA, R010SIT \\\\
WHERE R038AFA.SITAFA = R010SIT.CODSIT AND \\\\
R038AFA.NUMEMP = :xNumEmp_R316 AND \\\\
R038AFA.TIPCOL = :xTipCol_R316 AND \\\\
R038AFA.NUMCAD = :xNumCad_R316 AND \\\\
R038AFA.SitAfa = R010SIT.TIPSIT and \\\\
R038AFA.DATAFA <= :xFinal_R316 AND \\\\
R010SIT.TIPSIT = 17 ";
Cur_R038AFA.AbrirCursor();
Se (Cur_R038AFA.Achou)
@ ConverteMascara(3, Cur_R038AFA.DATAFA, vDatDem, "DDMMYYYY");@
R010SIT.TIPSIT = xSitua;
Cur_R038AFA.FecharCursor();
Se (R010SIT.TIPSIT = 17)
Cancel(1);
Clique aqui para fazer login e interagir na Comunidade :)