Como obter o valor maximo de uma data em Stored Procedure

Firebird

18/10/2004

Bem Amigos eu estou quebrando a cabeça a 3 dias com esta procedure e não estou conseguindo

CREATE PROCEDURE ULTIMA_CONTA (
CONTA INTEGER)
RETURNS (
MATRICULA VARCHAR (20),
GUIA VARCHAR (14),
TITULAR VARCHAR (60),
ORGAO VARCHAR (50),
MAXIMO DATE)
AS
DECLARE VARIABLE DAT DATE;
BEGIN
FOR SELECT AMMT, AMGA, AMTI, AMOR, MAX (AMDA) FROM AMBULATORIO
WHERE AMPA=:CONTA
GROUP BY AMMT, AMGA, AMTI, AMOR
UNION ALL
SELECT INMT, INGA, INTI, INOR, MAX (INDA) FROM INTERNACAO
WHERE INPA=:CONTA
GROUP BY INMT, INGA, INTI, INOR

INTO :MATRICULA, :GUIA, :TITULAR, :ORGAO, MAXIMO DO
SUSPEND;
END

Sei que meu erro esta aqui
[b:224a2fabac] GROUP BY INMT, INGA, INTI, INOR[/b:224a2fabac]

porém não como fazer sem o MAX


alguem tem uma solução ...


Sremulador

Sremulador

Curtidas 0

Respostas

Afarias

Afarias

18/10/2004

sempre q não estiver conseguindo fazer algo, por favor poste a mesnagem de erro, se não fica realmente difícil...


não sei mas apenas certifíque-se q os tipo dos campos são os mesmos::
AMMT = INMT
AMGA = INGA
AMTI = INTI
AMOR = INOR

e, se for o caso de um cast nas funções::

cast(MAX(AMDA) as Date)
cast(MAX(INDA) as Date)



T+


GOSTEI 0
Sremulador

Sremulador

18/10/2004

não sei mas apenas certifíque-se q os tipo dos campos são os mesmos:: AMMT = INMT AMGA = INGA AMTI = INTI AMOR = INOR


Sim os campos são os mesmos a procedure esta me dando retorno não ha erro e sim o retorno não e o esperado ele me retorna diversas datas enquanto deveria ser uma só ou melhor a maior....


GOSTEI 0
Afarias

Afarias

18/10/2004

se ele retorna 1 data para cada conjunto de

[AMMT,AMGA,AMTI e AMOR] diferentes, estão está perfeito.



T+


GOSTEI 0
Sremulador

Sremulador

18/10/2004

Justamente o que eu quero e saber se tem outra maneira para se obter este resultado...

Valeu


GOSTEI 0
Afarias

Afarias

18/10/2004

exatamente, que resultado vc quer?


T+


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/10/2004

precisa de adaptação, pois estou sem o IB/FB, mas é algo assim:


CREATE PROCEDURE ULTIMA_CONTA(CONTA INTEGER)
RETURNS (
    MATRICULA VARCHAR (20),
    GUIA VARCHAR (14),
    TITULAR VARCHAR (60),
    ORGAO VARCHAR (50),
    MAXIMO DATE)
AS
DECLARE VARIABLE DAT DATE;
BEGIN
    DAT := (SELECT MAX(AMDA) FROM FROM AMBULATORIO WHERE AMPA = :CONTA)

    IF DAT > (SELECT MAX(INDA) FROM INTERNACAO WHERE INPA = :CONTA) THEN
        FOR SELECT AMMT, AMGA, AMTI, AMOR, AMDA FROM AMBULATORIO
            WHERE AMPA = :CONTA AND AMDA = :DAT
        INTO :MATRICULA, :GUIA, :TITULAR, :ORGAO, MAXIMO DO
        SUSPEND
    ELSE
        FOR SELECT INMT, INGA, INTI, INOR, INDA FROM INTERNACAO
            WHERE INPA = :CONTA AND INDA =
            (SELECT MAX(INDA) FROM INTERNACAO WHERE INPA = :CONTA)
        INTO :MATRICULA, :GUIA, :TITULAR, :ORGAO, MAXIMO DO
        SUSPEND;
END


GOSTEI 0
Sremulador

Sremulador

18/10/2004

Amigo tem que ser em relação a duas tabelas internação e ambulatório entende


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

18/10/2004

da forma que eu sugeri ele retorna o registro que tem a maior data.

vc quer a maior data de cada tabela? é isso? se for, faça assim:

CREATE PROCEDURE ULTIMA_CONTA(CONTA INTEGER)
RETURNS (
    MATRICULA VARCHAR (20),
    GUIA VARCHAR (14),
    TITULAR VARCHAR (60),
    ORGAO VARCHAR (50),
    MAXIMO DATE)
AS
BEGIN
    FOR SELECT AMMT, AMGA, AMTI, AMOR, AMDA FROM AMBULATORIO
            WHERE AMPA = :CONTA AND AMDA =
                (SELECT MAX(AMDA) FROM FROM AMBULATORIO WHERE AMPA = :CONTA)
            UNION ALL
            SELECT INMT, INGA, INTI, INOR, INDA FROM INTERNACAO
            WHERE INPA = :CONTA AND INDA =
                (SELECT MAX(INDA) FROM INTERNACAO WHERE INPA = :CONTA)
    INTO :MATRICULA, :GUIA, :TITULAR, :ORGAO, MAXIMO DO
    SUSPEND;
END


GOSTEI 0
Sremulador

Sremulador

18/10/2004

Me desculpe amig não tinha reparado na sub-consulta, valeu vou testar...


GOSTEI 0
POSTAR