我正在使用 PaaS(Asset Works)创建需要循环的报告。我有一个公交车表,需要创建一个列出公交车替换的电子表格。有些公交车需要每 10 年更换一次,有些则每 12 年更换一次。我的报告需要列出未来 50 年的所有替代品。
我在 1..MaxCounter 循环中找到了循环结构 for Counter ,并了解如何执行查询并将值放入另一个表中。问题是这不是我的 Oracle 数据库。我无法创建表、临时表或烫发表。所以我的查询需要保存在我的报告中使用的值。
有什么建议吗?
提前致谢! 布鲁斯
Declare
Counter number;
MaxCounter number := 50;
StartYear number := 2021;
BEGIN
for Counter in 1..MaxCounter loop
Select * From eq_main where year(Delivery_Date) = startyear + maxcounter;
-- Save this rowset somewhere...
end Loop;
commit;
end;
如果我没猜错的话,您需要提前 50 年获得有关每年公交车更换和公交车组的数据 - 根据每个公交车组的有效期(以年为单位)。
一些可供使用的虚拟样本数据:
WITH -- S a m p l e D a t a :
tbl (ID, DELIVERY_DATE, BUS_GROUP, YEARS_VALID, AMOUNT) AS
( Select 1, DATE '2021-01-01', 'B', 10, 68000 From Dual Union All
Select 2, DATE '2021-02-01', 'C', 12, 97000 From Dual Union All
Select 3, DATE '2021-03-02', 'C', 12, 97000 From Dual Union All
Select 4, DATE '2021-04-01', 'B', 10, 68000 From Dual Union All
Select 5, DATE '2021-05-01', 'C', 12, 97000 From Dual Union All
Select 6, DATE '2022-02-01', 'B', 10, 68000 From Dual Union All
Select 7, DATE '2022-03-02', 'A', 5, 43000 From Dual Union All
Select 8, DATE '2022-09-02', 'A', 5, 43000 From Dual Union All
Select 9, DATE '2023-01-02', 'B', 10, 68000 From Dual
),
创建 2 个 CTE - 一个用于未来 50 年的列表,另一个(与第一个左连接)包含任何特定组期间需要更换的年份:
years_50 AS
( Select To_Number(To_Char(SYSDATE, 'yyyy')) + (LEVEL - 1) "A_YEAR"
From Dual
Connect By LEVEL <= 50
),
replacements AS
( Select y.A_YEAR,
t.BUS_GROUP, t.AMOUNT
From years_50 y
Inner Join tbl t ON( y.A_YEAR >= To_Number(To_Char(t.DELIVERY_DATE, 'yyyy')) + YEARS_VALID And
Mod((y.A_YEAR - To_Number(To_Char(t.DELIVERY_DATE, 'yyyy'))), YEARS_VALID) = 0)
)
现在我们可以对替换 cte 的数据进行分组、计数和计算总计,以获得每组应替换多少辆公交车:
-- M a i n S Q L :
SELECT A_YEAR, BUS_GROUP,
Count(BUS_GROUP) "QUANTITY",
AMOUNT "PRICE",
Count(BUS_GROUP) * AMOUNT "TOTAL"
FROM replacements
GROUP BY A_YEAR, BUS_GROUP, AMOUNT
ORDER BY A_YEAR, BUS_GROUP
/* R e s u l t :
A_YEAR BUS_GROUP QUANTITY PRICE TOTAL
---------- --------- ---------- ---------- ----------
2027 A 2 43000 86000
2031 B 2 68000 136000
2032 A 2 43000 86000
2032 B 1 68000 68000
2033 B 1 68000 68000
2033 C 3 97000 291000
2037 A 2 43000 86000
2041 B 2 68000 136000
2042 A 2 43000 86000
2042 B 1 68000 68000
2043 B 1 68000 68000
2045 C 3 97000 291000
2047 A 2 43000 86000
2051 B 2 68000 136000
2052 A 2 43000 86000
2052 B 1 68000 68000
2053 B 1 68000 68000
2057 A 2 43000 86000
2057 C 3 97000 291000
2061 B 2 68000 136000
2062 A 2 43000 86000
2062 B 1 68000 68000
2063 B 1 68000 68000
2067 A 2 43000 86000
2069 C 3 97000 291000
2071 B 2 68000 136000
2072 A 2 43000 86000
2072 B 1 68000 68000 */