Frage

Ich habe eine Frage, wo ich die Funktion aufrufe 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

Diese Funktionsrückgabewerte in ausgewähltem Zeitraum. Und ich muss diese Abfrage bearbeiten, um den Wert für jeden Monat im Jahr zurückzugeben. Etwas wie:

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]

Aber im Zyklus von 1 bis 12. Es ist so etwas sogar möglich?

War es hilfreich?

Lösung

Sie brauchen keine Schleife, sondern eine einfache Reihe von Ganzzahlen, an denen Sie beitreten können.

Tabelle der Ganzzahlen

In SQL, a Tabelle der Ganzzahlen wird oft dafür verwendet. Z.B,

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);

Ihre Serie ist so klein, dass Sie plausibel einen solchen Ergebnis -Set -Inline machen können:

    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;

Seriengenerierende Verfahren

Einige RDBMS -Versorgungsfunktionen, um solche Serien zu generieren, und ein Firebird Auswahlbarer gespeicherter Prozedur könnte für den gleichen Effekt geschrieben werden:

-- 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 ;!!

Die Abfrage sieht dann so aus:

    SELECT SUM(...),
           i AS "MONTH"
      FROM util$range(1, 12, 1)
CROSS JOIN StoreFlowsByDates(ib_encodedate(..., i, ...)...)
  GROUP BY 2;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top