Fórum Ajuda con instrucao SQL #310312
23/01/2006
0
SELECT * from ARQ_HIST a1 WHERE PAGA is null and (venc between current_date -140 and current_date -5) and not exists (select * from arq_hist a2 where (paga is null) and (a2.inscricao = a1.inscricao) and (venc < current_date -140)) and exists (select * from arq_nome a3 where (a3.inscricao = a1.inscricao) and (fale is null))
O que isso faz: Seleciona todos os registros que estao devendo de 140 dias até a data de 5 dias atras. Nas duas ultimas linhas eu queria que ele
filtrasse todos onde o campo FALE é nulo.
Mas quando eu rodo a pesquisa ele me tras os registros e inclui tbem os do campo FALE nao nulos...
Alguma dica ?
Geisonc
Curtir tópico
+ 0Posts
23/01/2006
Geisonc
a:=´SELECT * from ARQ_HIST a1 WHERE PAGA is null and venc between current_date -140 and current_date -5 and not exists´; b:=´(select * from arq_hist a2 where paga is null and a2.inscricao = a1.inscricao and venc < current_date -140) and exists´; c:=´(select * from arq_nome a3 where a1.inscricao = a3.inscricao and fale is not null) and exists´; d:=´(select * from arq_prin a4 where a1.inscricao = a4.inscricao and telefone is not null)´;
Agora se eu quero a mesma consulta porem com o campo FALE nulo,seria só tirar o [b:473127296f]not null [/b:473127296f]e colocar apenas [b:473127296f]null[/b:473127296f] no lugar..
(select * from arq_nome a3 where a1.inscricao = a3.inscricao and fale is null) and exists´...
ele nao filtra... mostra independente de ter dados ou nao neste campo.
Gostei + 0
23/01/2006
Emerson Nascimento
veja se assim funciona:
SELECT a1.* from ARQ_HIST a1 WHERE (a1.PAGA is null) and (a1.venc between current_date-140 and current_date-5) and not exists(select * from arq_hist a2 where (a2.paga is null) and (a2.inscricao = a1.inscricao) and (a2.venc < current_date -140)) and exists (select * from arq_nome a3 where (a3.inscricao = a1.inscricao) and (coalesce(fale,´´) = ´´))
como não foi informado o banco de dados, fiz a instrução para o FB.
no caso de SQL Server, troque coalesce() por isnull().
como também não informado o tipo do campo FALE, supus que seja alfanumérico
Gostei + 0
24/01/2006
Geisonc
Uso o Firebird.
O campo FALE é do tipo DATA.
Nao conheco o [b:197ce649ac]coalesce[/b:197ce649ac] como ele funciona ?.
Obrigado pela ajuda !
Gostei + 0
24/01/2006
Emerson Nascimento
por exemplo: imagine que você tem uma tabela de funcionário onde há os campos NOME, TELEFONE_RES e TELEFONE_CEL, com os seguintes registros:
NOME TELEFONE_RES TELEFONE_CEL ---------------------------------- JOAO 6121-3214 8998-7887 JOSE Null 9696-9898 ANTONIO Null Null MARIA Null 9595-5454 SILVIA Null Null PEDRO 6554-5445 Null
a instrução
select nome, coalesce(telefone_res,telefone_cel,´Não tem tel.´) from funcionarios
resultaria em:
JOAO 6121-3214 JOSE 9696-9898 ANTONIO Não tem tel. MARIA 9595-5454 SILVIA Não tem tel. PEDRO 6554-5445
Gostei + 0
24/01/2006
Geisonc
| INSCRICAO | GRUPO | SQUENCIA | FALE | | 100 | LON | 01 | | | 101 | LON | 01 | | | 100 | LON | 02 | 10/05 |
(FALE = FALECIMENTO)
Cada numero de inscricao é igual a um cliente. [b:18fc938d9a]MAS[/b:18fc938d9a] cada cliente tem N [b:18fc938d9a] DEPENDENTES [/b:18fc938d9a]
Entao uma inscricao pode ter varios dependendes. E se por exemplo eu pedia pra fazer uma pesquisa de todos os que o campo FALE era null, neste caso ele traria a INSCRICAO 100, pq há um registro nulo, embora tenha com o mesmo registro mas em outra sequencia um registro FALE em NOT NULL.
Mas agora como eu faco a pesquisa sendo que uma inscricao tem varios dependentes (na mesma tabela) ? e por exemplo, se eu quiser selecionar todos os FALE NULOS, e se um dependente ja tiver falecido, ele nao podera mostrar akela inscricao...
É complicado ou sou eu que to complicando demais ?
Obrigado a todos !!!
Gostei + 0
24/01/2006
Emerson Nascimento
SELECT a1.* from ARQ_HIST a1 WHERE (a1.PAGA is null) and (a1.venc between current_date-140 and current_date-5) and not exists(select * from arq_hist a2 where (a2.paga is null) and (a2.inscricao = a1.inscricao) and (a2.venc < current_date -140)) and not a1.inscricao in (select a3.inscricao from arq_nome a3 where fale is null)
Gostei + 0
24/01/2006
Geisonc
as instrucoes que eu fazia em SQL eram todas simples, insercao, edicao.. agora eu to apanhando um pouco....
mas to aprendendo... é o que interessa !!
Obrigado pela ajuda,
Gostei + 0
25/01/2006
Geisonc
emerson.en, mais alguma dica que possa me passar ?
Muito Obrigado a todos.
Gostei + 0
25/01/2006
Emerson Nascimento
SELECT a1.* from ARQ_HIST a1 WHERE (a1.PAGA is null) and (a1.venc between current_date -140 and current_date -5) and not a1.inscricao in (select a2.inscricao from arq_hist a2 where (a2.inscricao = a1.inscricao) and ( (venc < current_date -140) or (fale is null) ) )
se não aparecer nada, talvez esteja no mesmo caso da explicação que você deu anteriormente:
uma inscrição pode ter registros com FALE=NULL e FALE<>NULL
ou pode ter também registros com (VENC < CURRENT_DATE -140) e (VENC >= CURRENT_DATE -140). nesse caso, nada será mostrado.
Gostei + 0
25/01/2006
Geisonc
Suponhamos assim: Esquecemos o periodo de datas para filtro, selecionamos apenas os registros que tenham o campo FALE null ( é null mesmo, verifiquei no IBConsole), como ficaria para filtrar o campo inscricao quando fale é nulo e todos os seus dependentes (squencia) tbem sejam ? pq se um dependente (squencia) nao estiver nulo, ele já anula aquela inscricao...
Eu to me explicando direito ?
Gostei + 0
25/01/2006
Geisonc
SELECT a1.* from ARQ_HIST a1 WHERE (a1.PAGA is null) and (a1.venc between current_date -140 and current_date -5) and not a1.inscricao in (select a2.inscricao from arq_hist a2 where (a2.inscricao = a1.inscricao) and ( (venc < current_date -140) or not exists (select * from arq_nome where (fale is null)) ) )
Aparentemente nao ta mostrando os FALE NOT NULL, agora vou fazer uns testes mais rigorosos e posto aki caso de errado !!
Muito Obrigado mais uma vez.
Gostei + 0
25/01/2006
Geisonc
| Inscricao | Nome | Squencia | FALE 4933 | Maria | 1 | null 4933 | Joao | 2 | 10/01/2005 4933 | Marcos | 3 | null 4933 | Geison | 4 | null 4933 | Roberval | 5 | null 4933 | Ataide | 6 | null
No caso, ele mostrou essa inscricao como resultado pq dentro da inscricao 4933 a 6 dependetes, e apenas um tem o campo fale nao nulo, entao ele mostrou os outros 5 que tem o campo FALE null,,, mas quando algum dependete de alguma inscricao tiver o campo fale nao nulo, já nao podera ser mostrado no relatorio.
[/code]
Gostei + 0
25/01/2006
Emerson Nascimento
SELECT a1.* from ARQ_HIST a1 WHERE (a1.PAGA is null) and (a1.venc between current_date -140 and current_date -5) and not a1.inscricao in (select a2.inscricao from arq_hist a2 where (a2.inscricao = a1.inscricao) and ( (a2.venc < current_date -140) or (a2.fale is null) ) )
Gostei + 0
25/01/2006
Thomaz_prg
SELECT * FROM ARQ_HIST A1 WHERE (PAGA IS NULL) AND (venc between current_date -145 and current_date -5) AND (FALE IS NULL)
Notem que coloquei Current_Date - 145, pois se entendi bem, seria os que estariam vencidos a 140 dias até a data de 5 dias atrás. Tente aí pra ver se funciona.
Gostei + 0
25/01/2006
Geisonc
As duas tabelas sao assim:
ARQ_HIST
| Inscricao | Grupo | Venc | Paga | | 100 | IBI | 1/01/2006 | 01/01/2006 | | 101 | LON | 12/01/2006 | 12/01/2006 | | 102 | CUR | 10/01/2006 | 11/01/2006 |
agora a arq_nome
| Inscricao | squencia | Nome | Fale | | 100 | 1 | Geison | 01/01/2006 | | 101 | 1 | Marcos | 12/01/2006 | | 102 | 1 | Ruy | 11/01/2006 | | 102 | 2 | Ruy | null | | 102 | 3 | Ruy | null |
thomaz_prg .
seria perfeito o codigo se nao tivesse que procurar o FALE null, pois se eu quer consultar qual o cliente que nao tem nenhum falecimento na familia ele procura na inscricao do cliente, mas na inscricao do cliente pode ter varios parentes, mas com a mesma inscricao o que vai mudar eh o numero de sequencia. no exemplo da tabela ai em cima, a inscricao 102 tem 2 registros nulos e um com falecimento. quando peco pra fazer a consulta ele ta trazendo os 2 registros nulos, mas como akela inscricao já tem um falecimento, nao poderia estar constando no relatorio.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)