Sk1*_*1X1 4 sql firebird cycle series
我有查询,我在哪里调用函数 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
Run Code Online (Sandbox Code Playgroud)
此函数在选定的时间段内返回值.我需要编辑此查询以返回一年中每个月的值.就像是:
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]
Run Code Online (Sandbox Code Playgroud)
但是从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);
Run Code Online (Sandbox Code Playgroud)
你的系列很小,你可以合理地将这样的结果设置为内联:
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;
Run Code Online (Sandbox Code Playgroud)
一些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 ;!!
Run Code Online (Sandbox Code Playgroud)
然后查询如下所示:
SELECT SUM(...),
i AS "MONTH"
FROM util$range(1, 12, 1)
CROSS JOIN StoreFlowsByDates(ib_encodedate(..., i, ...)...)
GROUP BY 2;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1617 次 |
| 最近记录: |