سؤال

لدي استعلام ، حيث أتصل بالوظيفة 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

هذه الوظيفة إرجاع القيم في الفترة المحددة. وأنا بحاجة إلى تعديل هذا الاستعلام لإرجاع القيمة لكل شهر في السنة. شيء مثل:

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]

ولكن في دورة من 1 إلى 12. هل هذا شيء ممكن؟

هل كانت مفيدة؟

المحلول

لا تحتاج إلى حلقة ، ولكن سلسلة بسيطة من الأعداد الصحيحة التي يمكنك الانضمام إليها.

جدول الأعداد الصحيحة

في SQL ، أ جدول الأعداد الصحيحة غالبًا ما يستخدم لهذا الغرض. على سبيل المثال ،

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

سلسلتك صغيرة جدًا بحيث يمكنك جعل مثل هذه النتيجة محددة:

    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;

إجراءات توليد السلسلة

بعض وظائف إمدادات RDBMS لتوليد مثل هذه السلسلة ، و Firebird إجراء تخزين يمكن اختياره يمكن كتابتها لنفس التأثير:

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

الاستعلام ثم يشبه هذا:

    SELECT SUM(...),
           i AS "MONTH"
      FROM util$range(1, 12, 1)
CROSS JOIN StoreFlowsByDates(ib_encodedate(..., i, ...)...)
  GROUP BY 2;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top