Dificuldades com um select.......
Ola,
Tenho um select que funciona quando executado direto no banco e quando executo no delphi retorna vazio. Não da erro, por favor se alguem puder me auxiliar..... Segue o bixo papão:
select * from
[color=red:56458c7d99] (select max(cz06_dtat),cz04_nome from
cz060001,cz040001,cz080001
where
cz06_nrop=cz04_nrop and
cz06_med=cz08_crem and
cz08_nome like ´¬ANGELA¬´
group by cz04_nome
)[/color:56458c7d99] as ff where ff.max between ´2003-03-01´ and ´2003-03-30´;
Quando executo só o select interno retorna ok somente um registro para cada pessoa atendido pela ANGELA com a data mais atual. No entanto quero deste resultado somente os que o ultimo atendimento tenha ocorrido no intervalo definido.
ex: JOAO 01/01/03 -> ANGELA
JOAO 10/02/03 -> ANGELA
JOAO 15/03/03 -> ANGELA
MARIA 01/01/03 -> ANGELA
MARIA 05/02/03 -> ANGELA
SUPONDO QUE ESTES SEJAM TODOS OS MEUS DADOS.
DO PRIMEIRO SELECT VAI SAIR:
JOAO 15/03/03 -> ANGELA
MARIA 05/02/03 -> ANGELA
DO SELECT EXTERNO DEVERIA EXTRAIR SOMENTE A LINHA DO JOAO:
QUANDO EXECUTO DIRETO NO BANCO ESTE É O RESULTADO. QUANDO EXECUTO NO DELPHI O RESULTADO É ZERO REGSTROS.
SE EXECUTAR SOMENTE SEM O BETWEEN ...... TAMBEM DEVERIA RETORNAR O MESMO RESULTADO DO SELECT INTERNO. NO ENTANTO RETORNA ZERO. COMO SE O AS NÃO ESTIVESSE SENDO RECONHECIDO.
AGRADEÇO QUALQUER :idea:
Tenho um select que funciona quando executado direto no banco e quando executo no delphi retorna vazio. Não da erro, por favor se alguem puder me auxiliar..... Segue o bixo papão:
select * from
[color=red:56458c7d99] (select max(cz06_dtat),cz04_nome from
cz060001,cz040001,cz080001
where
cz06_nrop=cz04_nrop and
cz06_med=cz08_crem and
cz08_nome like ´¬ANGELA¬´
group by cz04_nome
)[/color:56458c7d99] as ff where ff.max between ´2003-03-01´ and ´2003-03-30´;
Quando executo só o select interno retorna ok somente um registro para cada pessoa atendido pela ANGELA com a data mais atual. No entanto quero deste resultado somente os que o ultimo atendimento tenha ocorrido no intervalo definido.
ex: JOAO 01/01/03 -> ANGELA
JOAO 10/02/03 -> ANGELA
JOAO 15/03/03 -> ANGELA
MARIA 01/01/03 -> ANGELA
MARIA 05/02/03 -> ANGELA
SUPONDO QUE ESTES SEJAM TODOS OS MEUS DADOS.
DO PRIMEIRO SELECT VAI SAIR:
JOAO 15/03/03 -> ANGELA
MARIA 05/02/03 -> ANGELA
DO SELECT EXTERNO DEVERIA EXTRAIR SOMENTE A LINHA DO JOAO:
QUANDO EXECUTO DIRETO NO BANCO ESTE É O RESULTADO. QUANDO EXECUTO NO DELPHI O RESULTADO É ZERO REGSTROS.
SE EXECUTAR SOMENTE SEM O BETWEEN ...... TAMBEM DEVERIA RETORNAR O MESMO RESULTADO DO SELECT INTERNO. NO ENTANTO RETORNA ZERO. COMO SE O AS NÃO ESTIVESSE SENDO RECONHECIDO.
AGRADEÇO QUALQUER :idea:
Mariah
Curtidas 0
Respostas
4_olho
15/08/2003
Percebo que os formatos de datas são diferentes :
dd/mm/aa e aaaa-mm-dd
Não seria melhor padronizar ? Qual Banco de dados está usando ?
dd/mm/aa e aaaa-mm-dd
Não seria melhor padronizar ? Qual Banco de dados está usando ?
GOSTEI 0
Mariah
15/08/2003
--> Testei mudando o formato de data:
st := ´select * from (select max(cz06_dtat),cz04_nome from cz060001,cz040001,cz080001 where cz06_nrop=cz04_nrop and cz06_med=cz08_crem and cz08_nome like ´+´´´¬ANGELA¬´´´+´ group by cz04_nome ) as ff where ff.max between ´+´´´01-03-2003´´´+´ and ´+´´´30-03-2003´´´;
Retornou zero registros.
--> Testei conforme linha abaixo ou seja sem datas:
st := ´select * from (select max(cz06_dtat),cz04_nome from cz060001,cz040001,cz080001 where cz06_nrop=cz04_nrop and cz06_med=cz08_crem and cz08_nome like ´+´´´¬ANGELA¬´´´+´ group by cz04_nome ) as ff ´;
Retornou zero registros.
--> Testei assim:
st := ´select max(cz06_dtat),cz04_nome from cz060001,cz040001,cz080001 where cz06_nrop=cz04_nrop and cz06_med=cz08_crem and cz08_nome like ´+´´´¬ANGELA¬´´´+´ group by cz04_nome ´;
Retornou 273 registros.
Como posso resolver !
Mariah
st := ´select * from (select max(cz06_dtat),cz04_nome from cz060001,cz040001,cz080001 where cz06_nrop=cz04_nrop and cz06_med=cz08_crem and cz08_nome like ´+´´´¬ANGELA¬´´´+´ group by cz04_nome ) as ff where ff.max between ´+´´´01-03-2003´´´+´ and ´+´´´30-03-2003´´´;
Retornou zero registros.
--> Testei conforme linha abaixo ou seja sem datas:
st := ´select * from (select max(cz06_dtat),cz04_nome from cz060001,cz040001,cz080001 where cz06_nrop=cz04_nrop and cz06_med=cz08_crem and cz08_nome like ´+´´´¬ANGELA¬´´´+´ group by cz04_nome ) as ff ´;
Retornou zero registros.
--> Testei assim:
st := ´select max(cz06_dtat),cz04_nome from cz060001,cz040001,cz080001 where cz06_nrop=cz04_nrop and cz06_med=cz08_crem and cz08_nome like ´+´´´¬ANGELA¬´´´+´ group by cz04_nome ´;
Retornou 273 registros.
Como posso resolver !
Mariah
GOSTEI 0
Weber
15/08/2003
Eu achei seu select um pouco confuso e não consegui identificar quantas tabelas você está usando, pois os nomes do campos são meio estranhos.
Mas veja bem:
Se você estiver trabalhando com duas ou mais tabelas é importante que você identifique que campo é de que tabela, por Exemplo:
Select a.* from Clientes a
Não sei se é o seu caso, pois como eu disse não entendi direito seus campos, e eu gostaria de salientar uma coisa, usar select dentro de select pode deixar seu sistema lento.
Mas veja bem:
Se você estiver trabalhando com duas ou mais tabelas é importante que você identifique que campo é de que tabela, por Exemplo:
Select a.* from Clientes a
Não sei se é o seu caso, pois como eu disse não entendi direito seus campos, e eu gostaria de salientar uma coisa, usar select dentro de select pode deixar seu sistema lento.
GOSTEI 0
Adilsond
15/08/2003
select cz04_nome,
max(cz06_dtat)
from cz060001,
cz040001,
cz080001
where cz06_nrop = cz04_nrop
and cz06_med = cz08_crem
and cz08_nome like ´¬ANGELA¬´
group by cz04_nome
having max(cz06_dtat) between :DtIni and :DtFin
ParamByName(´DtIni´).AsDate := StrToDate(´2003-03-01´);
ParamByName(´DtFin´).AsDate := StrToDate(´2003-03-30´);
ou se sua base for Oracle:
select cz04_nome,
max(cz06_dtat)
from cz060001,
cz040001,
cz080001
where cz06_nrop = cz04_nrop
and cz06_med = cz08_crem
and cz08_nome like ´¬ANGELA¬´
group by cz04_nome
having max(cz06_dtat) between to_date(´2003-03-01´,´yyyy-mm-dd´) and to_date(´2003-03-30´,´yyyy-mm-dd´)
max(cz06_dtat)
from cz060001,
cz040001,
cz080001
where cz06_nrop = cz04_nrop
and cz06_med = cz08_crem
and cz08_nome like ´¬ANGELA¬´
group by cz04_nome
having max(cz06_dtat) between :DtIni and :DtFin
ParamByName(´DtIni´).AsDate := StrToDate(´2003-03-01´);
ParamByName(´DtFin´).AsDate := StrToDate(´2003-03-30´);
ou se sua base for Oracle:
select cz04_nome,
max(cz06_dtat)
from cz060001,
cz040001,
cz080001
where cz06_nrop = cz04_nrop
and cz06_med = cz08_crem
and cz08_nome like ´¬ANGELA¬´
group by cz04_nome
having max(cz06_dtat) between to_date(´2003-03-01´,´yyyy-mm-dd´) and to_date(´2003-03-30´,´yyyy-mm-dd´)
GOSTEI 0
Daaneto
15/08/2003
Dependendo do banco que você utilizar o problema todo pode ser o símbolo de percentagem.
Alguns bancos utilizam como string coringa o * (asterisco), outros o ¬ (percentagem).
O que acho que pode resolver o problema citado é mudar ¬ANGELA¬ para
*ANGELA*.
Com ¬ANGELA¬ é interpretado como a string completa ´¬ANGELA¬´,
´*ANGELA*´ é interpretado como uma string que possui qualquer coisa ao início e ao fim de ANGELA.
Alguns bancos utilizam como string coringa o * (asterisco), outros o ¬ (percentagem).
O que acho que pode resolver o problema citado é mudar ¬ANGELA¬ para
*ANGELA*.
Com ¬ANGELA¬ é interpretado como a string completa ´¬ANGELA¬´,
´*ANGELA*´ é interpretado como uma string que possui qualquer coisa ao início e ao fim de ANGELA.
GOSTEI 0
Mariah
15/08/2003
Obrigado pelas colaborações, a situação que usei foi a do Adilson. Estou usando banco de dados Postgres com acesso pelo Zeos.
:wink:
:wink:
GOSTEI 0