SQL - Agrupamento entre tabelas
Olá, estou com um problema no meu trabalho e preciso de um help
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)
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
Curtidas 0
Melhor post
Luiz Santos
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
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
GOSTEI 7
Mais Respostas
Cesar Paez
23/10/2017
Como faço um group by para retornar apenas um registro?
GOSTEI 1
Chromusmaster
23/10/2017
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
GOSTEI 1
Cesar Paez
23/10/2017
Sim ele esta retornando duplicado, por isso queria uma ajuda em como fazer um group by pra que não retornasse duplicado.
GOSTEI 1
Luiz Santos
23/10/2017
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
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
Joimar Franco
23/10/2017
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);
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