SQL - Agrupamento entre tabelas

23/10/2017

0

Olá, estou com um problema no meu trabalho e preciso de um help
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

Cesar Paez

Responder

Post mais votado

24/10/2017

Cesar.

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

Luiz Santos
Responder

Mais Posts

23/10/2017

Cesar Paez

Como faço um group by para retornar apenas um registro?
Responder

24/10/2017

Chromusmaster

Você pode usar essa sua grande consulta como uma tabela ou seja SELECT nome_ficticio.nomecampo FROM (consulta gigante) AS nome_ficticio group by nome_ficticio.nomecampo
Responder

24/10/2017

Cesar Paez

Sim ele esta retornando duplicado, por isso queria uma ajuda em como fazer um group by pra que não retornasse duplicado.
Responder

24/10/2017

Luiz Santos

De uma verificada nos seus joins.
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
Responder

29/11/2017

Joimar Franco

estou tentado selecionar um situação de afastamento para ele não sair no relatório tipo 17 (licença premio) no seu período de gozo que é o mes de dezembro. Pergunto onde que esta o erro conforme especificação abaixo ::

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);
Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar