gpt4 book ai didi

sql - SQL查询中的循环?

转载 作者:行者123 更新时间:2023-12-03 01:02:45 25 4
gpt4 key购买 nike

我有查询,我在其中调用函数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 循环。这样的事情可能吗?

最佳答案

您不需要循环,而是可以 JOIN 的一系列简单整数。

整数表

在 SQL 中,table of integers经常用于此目的。例如,

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 selectable stored procedure可以写成相同的效果:

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

关于sql - SQL查询中的循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19840078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com