[****RESOLVIDO****] SELECT... to apanhando igual vaca na orta!!

Galera é o seguinte eu tenho uma tabela com a estrutura + ou - assim:

Table: vistorias

idvistorias
nsinistroseg
nsinistro
etc..etc..etc

Tenho outra tabela que controla os documentos deste processo:

id_docs
idvistorias
status

Conforme os caras enviam os documentos para o sistema eles alteram o status do mesmo como Recebido (1) mas o processo pode também ter documentos Pendentes (0) .
Bem agora preciso no select trazer todos os processos que estão com todos os documentos com seu status (1) e não traga nenhum processo que esteja com algum documento pendente (0)

Eu tentei este select:

SELECT
   vistorias.idvistorias,
   vistorias.nsinistroseg,
   vistorias.nsinistro,   
FROM
   docs_sol_rec INNER JOIN vistorias ON docs_sol_rec.idvistorias = vistorias.idvistorias
WHERE 
   (docs_sol_rec.status <> '-1') and (vistorias.statusvistoria <> 'Finalizado' or vistorias.statusvistoria <> 'Efetivado') 
GROUP BY vistorias.idvistorias

Mas ele esta me trazendo processos que tem documento pendentes e não faço ideia de como fazer um select que filtre isso.

Saulo,
Vê se isso funciona:

SELECT
   vistorias.idvistorias,
   vistorias.nsinistroseg,
   vistorias.nsinistro,   
FROM
   docs_sol_rec INNER JOIN vistorias ON docs_sol_rec.idvistorias = vistorias.idvistorias
   INNER JOIN (SELECT idvistorias, count(*) AS qtd FROM docs_sol_rec WHERE status = 0 GROUP BY idvistorias) conta ON vistorias.idvistorias = conta.idvistorias
WHERE 
   (conta.qtd = 0) AND (vistorias.statusvistoria <> 'Finalizado' or vistorias.statusvistoria <> 'Efetivado')
GROUP BY vistorias.idvistorias

[]s

Saulo,
Refiz a query. Vê agora:

SELECT
   vistorias.idvistorias,
   vistorias.nsinistroseg,
   vistorias.nsinistro
FROM
   vistorias
   RIGHT OUTER JOIN (
		SELECT qtd_st_0.idvistorias, SUM(qtd_st_0.qtd0) AS qtd0 FROM
		(SELECT idvistorias, count(*) AS qtd0, 0 AS qtd1 FROM docs_sol_rec WHERE status = 0 GROUP BY idvistorias
		UNION
		SELECT idvistorias, 0 AS qtd0, count(*) AS qtd1 FROM docs_sol_rec WHERE status = 1 GROUP BY idvistorias) qtd_st_0
		GROUP BY qtd_st_0.idvistorias
   ) conta ON vistorias.idvistorias = conta.idvistorias
WHERE 
   (conta.qtd0=0) AND (vistorias.statusvistoria <> 'Finalizado' or vistorias.statusvistoria <> 'Efetivado')

[]s

Alan parece que você matou a pau…:slight_smile: show de bola…!!! Tô fazendo alguns testes mais avançados mas parece que é isso mesmo.
Eu preciso urgente estudar SQL, isso dá muito mais poder às aplicações.

Um abraço!!

Saulo,
Talvez exista uma forma mais simples de fazer isso, ou de otimizar essa consulta.
Mas na falta de tempo…
[]s

Allan, parabéns pelo nível de conhecimento com relação a instrução! Pois foi pura lógica mesmo! Sei que existe diversas forma de chegar ao determinado fim, eu já apanhei muito com JOIN’S da vida e ainda apanho muito, mas só a prática mesmo pra nos deixar afiados.

Obrigado Fred.
Na verdade aprendi muito com uma ferramenta de geração de código em java que, pelo fato de ser muito simples, nos deixava totalmente engessados.
Então eramos obrigados a implementar muita coisa no banco de dados. Muitas views, triggers e procedures.
É sempre bom poder ver o lado positivo das dificuldades :wink:

[]s

Alan se não for abusar muito da sua paciência e prestatividade surgiu uma necessidade neste select que acredito não ser complicada mas fiz várias alterações nele pra tentar contemplar essa necessidade porém sem resultado, eu sou meio teimoso e só arrego quando todas as alternativas se esgotam.

Bem a intenção do select é mostrar para os peritos e reguladores que tais processos já estão com a documentação completa e que eles tem 2 dias para finaliza-los, bem eu até consegui mostrar a data do ultimo documento recebido colocando no OnRecord um select e jogando o valor em um campo virtual

{data_doc} = SELECT datarecebimento FROM docs_sol_rec WHERE idvistorias = {idvistorias};

porém embora data seja mostrada os dados do select principal são mostrados sem ordenação, o ideal seria que já no select principal eu conseguisse recuperar a data do último documento recebido, assim eu poderia ordenar os processos dos mais urgentes para os menos ou visse e versa.

Agradeço desde já a prestatividade!

saulo,
Tenta o seguinte:

SELECT vistorias.idvistorias, vistorias.nsinistroseg, vistorias.nsinistro, datadoc.ultima_data FROM vistorias LEFT OUTER JOIN ( SELECT idvistorias, MAX(nome_campo_data_doc) AS ultima_data FROM docs_sol_rec GROUP BY idvistorias ) datadoc ON vistorias.idvistorias=datadoc.idvistorias RIGHT OUTER JOIN ( SELECT qtd_st_0.idvistorias, SUM(qtd_st_0.qtd0) AS qtd0 FROM (SELECT idvistorias, count(*) AS qtd0, 0 AS qtd1 FROM docs_sol_rec WHERE status = 0 GROUP BY idvistorias UNION SELECT idvistorias, 0 AS qtd0, count(*) AS qtd1 FROM docs_sol_rec WHERE status = 1 GROUP BY idvistorias) qtd_st_0 GROUP BY qtd_st_0.idvistorias ) conta ON vistorias.idvistorias = conta.idvistorias WHERE (conta.qtd0=0) AND (vistorias.statusvistoria <> 'Finalizado' or vistorias.statusvistoria <> 'Efetivado')

Allan, perfeito agora vou conseguir entregar essa tela a tempo.

Mais uma vez muito obrigado mesmo!!

Saulo,
Coloca esse sql em uma view. De acordo com o DBA daqui o SGBD vai otimizar a consulta e deixar a execução mais rápida.
[]s

Opa Allan, boa dica vou providenciar isso, mais uma vez muito obrigado!