Pergunta

Eu tenho consulta, onde eu chamo função StoreFlowsByDates

select
  sum(a.beglocalamount+a.localamount)
from
 StoreFlowsByDates(ib_encodedate(EXTRACT(YEAR FROM CURRENT_DATE),1 ,1), ib_encodedate(EXTRACT(YEAR FROM CURRENT_DATE), 12 ,31), '', '', '', '', '', '', '', 'N', 'N', 'N', 'N', '1000000101', '') a

Esta função retorna valores no período selecionado. E preciso editar esta consulta para retornar o valor para cada mês em ano. Algo como:

select
  sum(a.beglocalamount+a.localamount),
  [SELECTED_MONTH]
from
 StoreFlowsByDates(ib_encodedate(EXTRACT(YEAR FROM CURRENT_DATE),[SELECTED_MONTH] ,1), ib_encodedate(EXTRACT(YEAR FROM CURRENT_DATE), [SELECTED_MONTH] ,31), '', '', '', '', '', '', '', 'N', 'N', 'N', 'N', '1000000101', '') a
group by
[SELECTED_MONTH]

Mas no ciclo de 1 a 12. É algo assim possível?

Foi útil?

Solução

Você não precisa de um loop, mas uma série simples de números inteiros contra os quais você pode participar.

Tabela de números inteiros

Em SQL, um Tabela de números inteiros é frequentemente usado para isso. Por exemplo,

CREATE TABLE UTIL$KILO (i INTEGER NOT NULL); -- one thousand integers, 0 – 999
INSERT INTO UTIL$KILO (i) VALUES (0);
INSERT INTO UTIL$KILO (i) VALUES (1);
...
INSERT INTO UTIL$KILO (i) VALUES (999);

Sua série é tão pequena que você pode fazer com que esse resultado estivesse em linha:

    SELECT SUM(...),
           i AS "MONTH"
      FROM (SELECT 1 AS i        --
              UNION ALL          -- We'll just enumerate the months here
            SELECT 2             --
              UNION ALL          --
            ...                  --
            SELECT 12) month_nos
CROSS JOIN StoreFlowsByDates(ib_encodedate(..., i, ...)...)
  GROUP BY 2;

Procedimentos de geração de séries

Alguns RDBMs fornecem funções para gerar essas séries e um Firebird Procedimento armazenado selecionável poderia ser escrito para o mesmo efeito:

-- UTIL$RANGE(start, stop, step)
--
-- Firebird selectable stored procedure for producing integer ranges.
-- (Public Domain)
--
CREATE EXCEPTION util$err_range_zero_step 'step size may not be zero';
SET TERM !!;
CREATE PROCEDURE util$range("Start" INTEGER, "Stop" INTEGER, "Step" INTEGER)
  RETURNS (i INTEGER) AS
BEGIN
  IF ("Step" > 0) THEN BEGIN
    i = "Start";
    WHILE (i <= "Stop") DO BEGIN
      SUSPEND;
      i = i + "Step";
    END
  END
  ELSE IF ("Step" < 0) THEN BEGIN
    i = "Start";
    WHILE (i >= "Stop") DO
    BEGIN
      SUSPEND;
      i = i + "Step";
    END
  END
  ELSE IF ("Step" = 0) THEN
    EXCEPTION util$err_range_zero_step;
  -- ELSE return empty set
END !!
SET TERM ;!!

A consulta então se parece com o seguinte:

    SELECT SUM(...),
           i AS "MONTH"
      FROM util$range(1, 12, 1)
CROSS JOIN StoreFlowsByDates(ib_encodedate(..., i, ...)...)
  GROUP BY 2;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top