【发布时间】:2019-12-31 01:59:15
【问题描述】:
这是我的桌子:
CREATE TABLE ABC
(
nekey NUMBER(5),
seq number(20),
task varchar2(10),
status varchar2(10),
entrydat date,
findat DATE
);
价值观:
insert into ABC (nekey, seq, task, status, entrydat, findat) values (1, 3, 'Build', 'Closed',
to_date('08-01-2019', 'mm-dd-yyyy'), to_date('08-04-2019', 'mm-dd-yyyy'));
insert into ABC (nekey, seq, task,status, entrydat, findat) values (1, 6,'Paint','Open', null,
null);
insert into ABC (nekey,seq, task,status, entrydat, findat) values (1, 9,'Assemble','Pending', null,
null);
insert into ABC (nekey,seq, task,status, entrydat, findat) values (2, 3,'Build', 'Closed',
to_date('08-02-2019', 'mm-dd-yyyy'), to_date('08-05-2019', 'mm-dd-yyyy'));
insert into ABC (nekey,seq, task, status,entrydat, findat) values (2, 6,'Paint', 'Closed',
to_date('08-05-2019', 'mm-dd-yyyy'), to_date('08-09-2019', 'mm-dd-yyyy'));
insert into ABC (nekey,seq, task, status,entrydat, findat) values (2,9, 'Assemble', 'Open', null,
null);
现在我想得到如下输出:
对于每个键,任务按以下顺序排列。
1) 构建
2) 绘画
3) 组装。 ((但我的数据有20多个任务)我以这3个为例)
所以,我必须计算“天”列,如附图所示。
所以当
1) 状态为关闭然后 findate-entrydate
2)当状态为 Open 或 Null 时(sysdate - previous task 的 Findate )(我已经解决了第一个任务是 Open 的情况,它是 projectstartdate - entrydate)
3) 当状态为 Pending 时不计算
我如何在 Oracle SQL 中做到这一点,
【问题讨论】:
-
我们可以解决您发布的问题,但这可能不足以解决您的实际问题。具体来说:您说您有 15 个不同的“任务”,而且它们似乎是完全有序的。是什么给出了这个命令?您是否有一个“任务”表,其中显示每个任务,并按顺序排列?如果是这样,发布一个小样本也会有所帮助(在这种情况下,一个小表,三行用于三个任务,两列用于“任务名称”和“seq_num”(序列号)。
-
另外,如果 FIRST 任务处于 OPEN 状态怎么办?那么就没有上一个任务的FINDATE了;是否应该将 FINDATE 视为 NULL(在这种情况下,与 SYSDATE 的差异也是 NULL)?
-
是的,我可以修改问题,
-
我已经解决了第一个任务为Null的情况,我只是减去ProjectStartDate - Entrydate
-
请运行您的 CREATE TABLE 和 INSERT 语句(在您可以从头开始重新创建表的测试模式中),并调试它们直到它们工作。您的陈述中有许多错误。