Jump to content

dev botao

Ajuda SQL


johnbh3
  • Este tópico foi criado há 270 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;

 

Edited by johnbh3
erro
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.