Ir para conteúdo
  • Cadastre-se

dev botao

Ajuda SQL


johnbh3
  • Este tópico foi criado há 245 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

 

Eu fiz pra teste esta procedure debugando  ela faz o que quero, porem não retorna dados qdo da o suspende. Queria que retornasse o grid de dados.

Seria o caso de usar o RETURNS?

 

 

CREATE PROCEDURE SP1 (
    START_VAL INTEGER,
    END_VAL INTEGER)
AS--
DECLARE VARIABLE MES_I INTEGER;
DECLARE VARIABLE MES_STR VARCHAR(3);
BEGIN
    MES_I = :START_VAL;
    WHILE (MES_I <= :END_VAL) DO
    BEGIN
        MES_STR = CASE MES_I
            WHEN 1 THEN 'Jan'
            WHEN 2 THEN 'Fev'
            WHEN 3 THEN 'Mar'
            WHEN 4 THEN 'Abr'
            WHEN 5 THEN 'Mai'
            WHEN 6 THEN 'Jun'
            WHEN 7 THEN 'Jul'
            WHEN 8 THEN 'Ago'
            WHEN 9 THEN 'Set'
            WHEN 10 THEN 'Out'
            WHEN 11 THEN 'Nov'
            WHEN 12 THEN 'Dez'
        END;


        MES_I = MES_I + 1;
        SUSPEND;
    END
END

 

 

O que eu realmente queria  que deu certo neste SQL, mas qual o problema uma soma por mes ocorre que de teste so tenho registro na tabela no mes 08/2023 dai so retornou um registro e quando for 0 (Zero) pra janeiro que e o caso por não haver pagamentos em CT_DUPL gera um registro
Ou seja queria os 12 meses como retorno mesmo que não haja pagamentos dai vi como alternativa fazer while em procedure ou tem outra sugestão vocês? 

SELECT EXTRACT(MONTH FROM DTA_CONT) AS MES,
       EXTRACT(YEAR FROM DTA_CONT) AS ANO,
       SUM(VR_DOC) AS TOTAL_VR_DOC
FROM CT_DUPL
WHERE EXTRACT(YEAR FROM DTA_CONT) = EXTRACT(YEAR FROM CURRENT_DATE)
GROUP BY EXTRACT(MONTH FROM DTA_CONT), EXTRACT(YEAR FROM DTA_CONT)
ORDER BY ANO, MES;

 

Editado por johnbh3
erro
Link para o comentário
Compartilhar em outros sites

              EXECUTE BLOCK RETURNS (
  MES VARCHAR(10),
  TOTAL_VR_DOC NUMERIC (18,2)
)
AS
DECLARE VARIABLE MonthNumber INTEGER;
DECLARE VARIABLE ANO INTEGER;
BEGIN
   MonthNumber = 1;

   WHILE (MonthNumber <= 12) DO
   BEGIN
        MonthNumber = MonthNumber + 1;
        MES = MonthNumber;
        ANO = EXTRACT(YEAR FROM current_date);
        
        SELECT COALESCE(SUM(VR_DOC), 0)
        FROM CT_DUPL
        WHERE EXTRACT(MONTH FROM DTA_CONT) = :MonthNumber AND EXTRACT(YEAR FROM DTA_CONT) = :ANO
        INTO: TOTAL_VR_DOC;
        
      SUSPEND;
   END


END

fiz isso daqui  nao se e e uma boa

Link para o comentário
Compartilhar em outros sites

  • Moderadores

Boa noite!
Abaixo uma maneira de trazer o resultado. 
Eu testei no MySql, acredito que seja compatível , minha dúvida seria os comandos PADL() e ISNULL(), caso não seja da mesma forma no SQL substitua os comandos.

 

Citar

SELECT m.id as mes
 ,  if( ISNULL(extract(YEAR FROM x.DTA_CONT))  ,  extract(YEAR FROM current_date)  ,  extract(YEAR from x.DTA_CONT) )  as ANO
 ,  if( ISNULL(SUM(x.VR_DOC)), 0 , sum(x.VR_DOC) ) as TOTAL_VR_DOC
FROM (
      SELECT lpad(1,2,0) AS id
      UNION SELECT lpad(2,2,0) AS id
      UNION SELECT lpad(3,2,0) AS id
      UNION SELECT lpad(4,2,0) AS id
      UNION SELECT lpad(5,2,0) AS id
      UNION SELECT lpad(6,2,0) AS id
      UNION SELECT lpad(7,2,0) AS id
      UNION SELECT lpad(8,2,0) AS id
      UNION SELECT lpad(9,2,0) AS id
      UNION SELECT 10 AS id
      UNION SELECT 11 AS id
      UNION SELECT 12 AS id
      ) AS m
LEFT JOIN (
       select DTA_CONT, VR_DOC
       from CT_DUPL 
       ) x on m.id = extract(month from x.DTA_CONT)  and  extract(year from x.DTA_CONT) = extract(year from current_date)
group by  m.id , extract(month from x.DTA_CONT) ,  extract(year from x.DTA_CONT)

image.png

 


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 245 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.