Fórum SQL - Agrupamento entre tabelas #587074
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
Curtir tópico
+ 0Post 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
Gostei + 7
Mais Posts
23/10/2017
Cesar Paez
Gostei + 1
24/10/2017
Chromusmaster
Gostei + 1
24/10/2017
Cesar Paez
Gostei + 1
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
Gostei + 2
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);
Gostei + 1
Clique aqui para fazer login e interagir na Comunidade :)