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…会给它一个机会。