如何使用循环和 Oracle 12c 创建数据(不是临时表)?

问题描述 投票:0回答:1

我正在使用 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;
loops oracle12c temp-tables
1个回答
0
投票

如果我没猜错的话,您需要提前 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 */
© www.soinside.com 2019 - 2024. All rights reserved.