我迫切地向所有 Oracle SQL 专家和超级英雄寻求帮助。任何建议和/或帮助将不胜感激。
我有一张桌子
表DDL和DML
create table tab_A
(item varchar2(20),
dest varchar2(20),
qty number,
eff date,
disc date,
eventbegin date,
eventend date,
eventqty number
);
insert into tab_a values('item1','dest1',18,'27 July 2023','4 Sep 2023','4 Aug 2023','25 Sep 2023',6);
insert into tab_a values('item1','dest1',30,'4 Sep 2023','2 Oct 2023','4 Aug 2023','25 Sep 2023',6);
insert into tab_a values('item1','dest1',18,'2 Oct 2023','1 Sep 2025','4 Aug 2023','25 Sep 2023',6);
表A
项目 | 目的地 | 数量 | EFF | 光盘 | 开始 | 活动结束 | 活动数量 |
---|---|---|---|---|---|---|---|
项目1 | 目的地1 | 18 | 2023 年 7 月 27 日 | 2023 年 9 月 4 日 | 2023 年 8 月 4 日 | 2023 年 9 月 25 日 | 6 |
项目1 | 目的地1 | 30 | 2023 年 9 月 4 日 | 2023年10月2日 | 2023 年 8 月 4 日 | 2023 年 9 月 25 日 | 6 |
项目1 | 目的地1 | 18 | 2023年10月2日 | 2025 年 9 月 1 日 | 2023 年 8 月 4 日 | 2023 年 9 月 25 日 | 6 |
所需输出
新创建的 EFF 和 DISC 日期应始终是连续的。
我需要根据以下内容调整 Eff 和 DISC 日期
新创建的 EFF 和 DISC 日期应始终是连续的。
项目 | 目的地 | ORIG_QTY | EFF_DATE | DISC_DATE |
---|---|---|---|---|
项目1 | loc1 | 18 | 2023 年 7 月 27 日 | 2023年8月28日 |
项目1 | loc1 | 24 | 2023年8月28日 | 2023 年 9 月 4 日 |
项目1 | loc1 | 36 | 2023 年 9 月 4 日 | 2023 年 9 月 25 日 |
项目1 | loc1 | 30 | 2023 年 9 月 25 日 | 2023 年 10 月 2 日 |
项目1 | loc1 | 18 | 2023 年 10 月 2 日 | 2999/1/1 |
我看不到您为此使用多个查询,尽管这不应该是问题。这可能需要一个多小时才能解决,但我希望我能帮助你。
您可能想要使用
CASE WHEN
表达式来处理所有的 if 和 buts。 https://docs.oracle.com/cd/B19306_01/server.102/b14200/expressions004.htm
您还可以通过使用多个查询连接到一个结果来帮助解决此问题,因为您有三行并且需要六行。 https://www.oracletutorial.com/oracle-basics/oracle-union/
在处理部分日期问题时,似乎使用
LAG()
函数可能适合您,因为它会查看上一行。
https://www.oracletutorial.com/oracle-analytic-functions/oracle-lag/
LAG()
函数可以与 DateAdd()
函数结合使用,以帮助获得正确的日期。 https://docs.oracle.com/cd/E41183_01/DR/Dateadd.html
您可能还想使用通用表表达式(CTE),它可以帮助简化查询。这是更可选的,并且可能会使其更难以可视化,但它的性能也并非不可能。 https://docs.oracle.com/cd/E17952_01/mysql-8.0-en/with.html#common-table-expressions