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

Geisonc

Responder

Posts

23/01/2006

Geisonc

ohem que estranho... eu fiz deste modo e deu certo....

         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.


Responder

Gostei + 0

23/01/2006

Emerson Nascimento

você precisa certificar-se se o campo está nulo ou simplesmente vazio, que são coisas diferentes.
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


Responder

Gostei + 0

24/01/2006

Geisonc

Ola colega !

Uso o Firebird.
O campo FALE é do tipo DATA.
Nao conheco o [b:197ce649ac]coalesce[/b:197ce649ac] como ele funciona ?.

Obrigado pela ajuda !


Responder

Gostei + 0

24/01/2006

Emerson Nascimento

coalesce() serve para retornar um valor alternativo caso a avaliação do parâmetro ´anterior´ seja nula.

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



Responder

Gostei + 0

24/01/2006

Geisonc

Bom pessoal, eu descobri o porque o filtro dava errado. como eu nao fiz este banco, nao sabia que era assim que funcionava,. mas a estrutura da tabela eh resumidamente assim...


| 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 !!!


Responder

Gostei + 0

24/01/2006

Emerson Nascimento

tente assim:
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)



Responder

Gostei + 0

24/01/2006

Geisonc

nao mostrou nenhum dado... mas vou estuda-la para ver o que precisa ser alterado ! Vc usou um [b] IN [b] na instrucao.. interessante !

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,


Responder

Gostei + 0

25/01/2006

Geisonc

Bom pessoal, realmente nao estou conseguindo agora, se a inscricao fosse em uma tabela e a Sequencia em outra, daria certo, mas desse jeito nao to conseguindo....

emerson.en, mais alguma dica que possa me passar ?

Muito Obrigado a todos.


Responder

Gostei + 0

25/01/2006

Emerson Nascimento

tente assim:
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.


Responder

Gostei + 0

25/01/2006

Geisonc

mas no caso do codigo acima, FALE esta sendo como da mesma tabela, porem o FALE é da tabela arq_nome...

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 ?


Responder

Gostei + 0

25/01/2006

Geisonc

bom... fiz assim alterando só a tabela no exemplo q vc deu...

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.


Responder

Gostei + 0

25/01/2006

Geisonc

ta mostrando os not null tbem pelo motivo de uma insricao ter varios dependentes. um exemplo do resultado da consulta acima foi desta inscricao: (foram mostradas varias inscricoes coloquei apenas uma que nao poderia estar mostrando)...


| 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]


Responder

Gostei + 0

25/01/2006

Emerson Nascimento

com essa instrução, qual é o retorno?
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) 
                         ) 
                      )



Responder

Gostei + 0

25/01/2006

Thomaz_prg

Pessoal, como dizem, ´peguei o bonde andando´, mas se a intenção é mostrar todos os que estão com data de vencimento entre 140 dias atrás, até os 5dias atrás, quando o campo Fale for nulo, não seria só isso??


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.


Responder

Gostei + 0

25/01/2006

Geisonc

emerson.en , da um erro pois nao existe o campo FALE na tabela arq_hist e sim na arq_nome.
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.


Responder

Gostei + 0

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

Aceitar