Plsql Oracle SQL将一条记录拆分为多条记录

Plsql Oracle SQL将一条记录拆分为多条记录,plsql,oracle11g,Plsql,Oracle11g,假设我有一个记录如下的表: ID Yr MonthNumber Type Amount 2 2020 Annual Forecast 12,000 然后,假设我想从表中删除此记录,并以每月的频率均匀插入相同的值,如下所示: ID Yr MonthNumber Type Amount 4 2020 1 Mont

假设我有一个记录如下的表:

ID  Yr      MonthNumber     Type                Amount
2   2020                    Annual Forecast     12,000
然后,假设我想从表中删除此记录,并以每月的频率均匀插入相同的值,如下所示:

ID  Yr      MonthNumber     Type                Amount
4   2020    1               Monthly Forecast    1,000
5   2020    2               Monthly Forecast    1,000
6   2020    3               Monthly Forecast    1,000
7   2020    4               Monthly Forecast    1,000
8   2020    5               Monthly Forecast    1,000
9   2020    6               Monthly Forecast    1,000
10  2020    7               Monthly Forecast    1,000
11  2020    8               Monthly Forecast    1,000
12  2020    9               Monthly Forecast    1,000
13  2020    10              Monthly Forecast    1,000
14  2020    11              Monthly Forecast    1,000
15  2020    12              Monthly Forecast    1,000
有什么简单的方法可以做到这一点吗?我有一个包含月度和年度数据的表,所以我想让频率保持不变。可能有一个程序开始“针对每一行,其中类型=”年度预测“。。。。但是我不知道正确的语法

更新:最终解决方案 我输入了本例中使用的实际字段。答案来源于以下HepC解决方案。谢谢大家!

INSERT INTO STG_DFF_B("Forecast Month","Publish Date","FinancialPlanType","Subaccount","ITN","Project ID","Resource Type","Details",UNIT,VALS,MONTHNUMBER,"YR")
SELECT "Forecast Month",
    "Publish Date",
    "FinancialPlanType",
    "Subaccount",
    ITN,
    "Project ID",
    "Resource Type",
    "Details",
    UNIT,
    ROUND(VALS/12,2),
    x.lvl,
    "YR"
FROM STG_DFF_B
CROSS JOIN (SELECT LEVEL AS lvl -- Joins in 1 through 12.
           FROM dual
         CONNECT BY LEVEL <= 12) x
WHERE MONTHNUMBER is null;

考虑到您描述的需求和数据质量,我可能会按照下面的思路做一些事情

INSERT INTO sample_table
SELECT sample_seq.nextval
      ,st.yr
      ,x.lvl
      ,'Monthly Forecast'
      ,st.amount / 12 -- Maybe with ROUND or TRUNC? Depends.
  FROM sample_table st
 CROSS JOIN (SELECT LEVEL AS lvl -- Joins in 1 through 12.
               FROM dual
             CONNECT BY LEVEL <= 12) x
 WHERE st.type = 'Annual Forecast'
   AND NOT EXISTS (SELECT NULL -- Not already present as month (reentrant scripting)
                     FROM sample_table stm
                    WHERE stm.yr = st.yr
                      AND stm.monthnumber IS NOT NULL);

DELETE FROM sample_table st WHERE st.type = 'Annual Forecast';

考虑到您描述的需求和数据质量,我可能会按照下面的思路做一些事情

INSERT INTO sample_table
SELECT sample_seq.nextval
      ,st.yr
      ,x.lvl
      ,'Monthly Forecast'
      ,st.amount / 12 -- Maybe with ROUND or TRUNC? Depends.
  FROM sample_table st
 CROSS JOIN (SELECT LEVEL AS lvl -- Joins in 1 through 12.
               FROM dual
             CONNECT BY LEVEL <= 12) x
 WHERE st.type = 'Annual Forecast'
   AND NOT EXISTS (SELECT NULL -- Not already present as month (reentrant scripting)
                     FROM sample_table stm
                    WHERE stm.yr = st.yr
                      AND stm.monthnumber IS NOT NULL);

DELETE FROM sample_table st WHERE st.type = 'Annual Forecast';

只是稍微修改一下。希望这也有帮助

INSERT INTO DUMM
SELECT level+a.id id,
  a.yr,
  level,
  'Monthly Forecast' TYP,
  ROUND(a.amt/12) amt
FROM DUMM a
  CONNECT BY level <= DECODE(a.TYP,'Annual Forecast',12,'Monthly Forecast',6,'Quarterly Forecast',4);

DELETE DUMM WHERE TYP = 'Annual Forecast';

只是稍微修改一下。希望这也有帮助

INSERT INTO DUMM
SELECT level+a.id id,
  a.yr,
  level,
  'Monthly Forecast' TYP,
  ROUND(a.amt/12) amt
FROM DUMM a
  CONNECT BY level <= DECODE(a.TYP,'Annual Forecast',12,'Monthly Forecast',6,'Quarterly Forecast',4);

DELETE DUMM WHERE TYP = 'Annual Forecast';

是否有任何情况下,您的数据包含月度预测,同时也包含同一年的年度预测?如果不是,您可以使用简单的SQL语句而不是PL/SQL。即使有,SQL也只是利用合并而不是插入。有点不太出名,但仍然很小。好问题。不,年度预测总是与月度预测不同的年份。我不知道合并。。快速查看文档,看起来就是这样!非常感谢。谷物在某些上下文中用作一个技术术语,其含义与您的意图不同。最好称之为频率以避免混淆。有些事情我不明白。身份证怎么了?这不是应该保持不变的吗?例如,如果它是贷款ID或租户ID等,则不应更改。如果它确实发生了变化,那么数字从哪里来?为什么是4到15,而不是2到13或任何其他序列?ID没有任何变化……只是想指出,它应该删除年度记录并插入12个新记录,以年度数字替换并均匀分布。这只是表的主键/唯一键。是否存在这样的情况,即您的数据包含月度预测,同时也包含同一年的年度预测?如果不是,您可以使用简单的SQL语句而不是PL/SQL。即使有,SQL也只是利用合并而不是插入。有点不太出名,但仍然很小。好问题。不,年度预测总是与月度预测不同的年份。我不知道合并。。快速查看文档,看起来就是这样!非常感谢。谷物在某些上下文中用作一个技术术语,其含义与您的意图不同。最好称之为频率以避免混淆。有些事情我不明白。身份证怎么了?这不是应该保持不变的吗?例如,如果它是贷款ID或租户ID等,则不应更改。如果它确实发生了变化,那么数字从哪里来?为什么是4到15,而不是2到13或任何其他序列?ID没有任何变化……只是想指出,它应该删除年度记录并插入12个新记录,以年度数字替换并均匀分布。这只是表主键/唯一键。谢谢Hep…会给它一个机会。谢谢Hep…会给它一个机会。