SELECT COMPLICADO

LUIS.HERRERA 30/05/2014 16:07:12
#438635
Boa tarde. Estou tentando montar um SELECT com base na estrutura das tabelas da ilustração anexa. Não há relacionamento no banco, tudo é feito via SELECT:

O que preciso é listar todos os registros da tabela Documentos (Principal) que estejam vencidos.
Para saber isso preciso recorrer a tabela (Auxiliar) Documentos_Aprovacoes que possui todas as aprovações deste documento desde seu cadastro inicial. Porém preciso pegar APENAS A ÚLTIMA APROVACAO cadastrada (mais recente) e sobre ela aplicar o teste com base em um número de meses ex: 6, ou seja, depois de ter a data mais recente deste documento (maior Data Cadastrada para esse IDDocumento), tenho de somar 6 meses a esta data encontrada e comparar com a DATA de Hoje do SQL Server, se a data Cadastrada + 06 meses for MENOR que a data de hoje, então pego o registro, do contrário NÃO e assim para todos os registros da tabela Documentos. O resultado será uma lista que exibirei num Grid.

Um exemplo prático:
Documentos - Campos: IDDocumento - IDEmpresaEmitente - ex....
[txt-color=#e80000]1 - 1[/txt-color]
2 - 1
3 - 1
[txt-color=#e80000]4 - 2[/txt-color]
... (aqui tem 4 documentos cadastrados, sendo nrs.(1 a 3) para empresa 1 e nr (4) para empresa 2.

Documentos_Aprovacoes Campos: IDAprovacao - IDDocumento - DataAprov_Reaprov - ex...
1 - 1 - 01/04/2013
2 - 1 - 01/10/2013
[txt-color=#007100]3 - 1 - 01/04/2014[/txt-color]
4 - 2 - 01/09/2013
5 - 2 - 01/ 03/2014
6 - 3 - 05/01/2014
[txt-color=#007100]7 - 4 - 01/12/2013[/txt-color]
.... (aqui tenho 3 aprovações para o documento (1) da empresa (1) e 1 aprovação para o documento (2) também da empresa (1).

O resultado da lista do SELECT deve conter os registros destacados em Vermelho na tabela Documentos, pois testou os registros em Verde da Auxiliar:
Nota: Os outros registros Auxliares (Maior Data) de cada registro não selecionado, também foram testados, mas não marquei em verde para não confundir, pois não atenderiam ao requisito de 6 meses a partir da data avaliada.

Então para montar o select tenho de textar:
Documentos.IDEmpresaEmitente = x
e
Documentos_Aprovacoes.IDDocumento = Documentos.IDDocumento AND Documentos_Aprovacoes.DataAprov_Reaprov + 6 meses <= DataHoje SQL Server

Agradeço a ajuda
NETMANIA 30/05/2014 18:34:22
#438641
Boa noite.

Segue um exemplo do select, veja se ele lhe atende

SELECT
doc.iddocumento,
doc.idtipodocumento,
aprovacoes.data_aprovacao_reprovacao
FROM
documentos AS doc,
documentos_aprovacoes AS aprovacoes
WHERE
doc.iddocumento = aprovacoes.iddocumento AND
DATEADD(month, 6, aprovacoes.data_aprovacao_reprovacao) <= GETDATE()
FFCOUTO 30/05/2014 20:32:38
#438642
Resposta escolhida
Luís,

Só um comentário: os registros que você marcou em verde não estão dentro do seu critério. Veja a linha 3, a data é 01/04/2014 mais 6 meses seria 01/10/2014 ficando fora pois hoje esta data é posterior a data de hoje.

O comando abaixo irá funcionar do jeito que precisa.

SELECT * FROM (
SELECT iddocumento, MAX(dataaprov_reprov) AS data FROM documentos_aprovacoes AS da
GROUP by iddocumento
) AS temp
INNER JOIN documentos AS d on temp.iddocumento = d.iddocumento
WHERE (DATEADD(MM, 6, data) <= GETDATE());


Abraços,
Tópico encerrado , respostas não são mais permitidas