我使用一个包含各种里程碑的表来确定合同的各个阶段。每个里程碑都有一个日期,我需要在其中几个里程碑上构建一份报告,以确定项目从一个阶段到另一个阶段的平均时间长度。这个表包含了从1996年到现在的信息,我只对过去一年中已经完成的项目(里程碑4.08)感兴趣。
麻烦的是,我似乎无法构建一个case语句来查找特定的里程碑,然后过滤对应于它的日期。下面是我正在处理的代码。
Select Distinct CONSTRUCTION.CONTRACTS.CONTRACTNUMBER,
CONSTRUCTION.TBL_CONTRACTPROJECTCOMBO.LOCATIONS,
Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'3.02' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End) RECEIVED_IN_AUDIT,
Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'4.04' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End) INITIAL_AUDIT_COMPLETE,
Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'4.08' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End) FINAL_AUDIT_COMPLETE,
(Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'4.08' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End) - (Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'3.02' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End))) DAYS_IN_AUDIT,
(Case
When Extract(Month From Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'4.08' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End)) >= 7 Then
Extract(Year From Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'4.08' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End)) + 1
Else
Extract(Year From Max(Case
When CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER =
'4.08' Then
CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE
End))
End) FY_AUDIT_COMPLETE
From CONSTRUCTION.CONTRACTS
Join CONSTRUCTION.CONTRACTMILESTONES on CONSTRUCTION.CONTRACTMILESTONES.CONTRACTID = CONSTRUCTION.CONTRACTS.ID
Join CONSTRUCTION.MILESTONEEVENTS on CONSTRUCTION.MILESTONEEVENTS.ID = CONSTRUCTION.CONTRACTMILESTONES.MILESTONEID
Join CONSTRUCTION.TBL_CONTRACTPROJECTCOMBO on CONSTRUCTION.TBL_CONTRACTPROJECTCOMBO.CONTRACTNUMBER = CONSTRUCTION.CONTRACTS.CONTRACTNUMBER
Where (CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER = '4.04' Or
CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER = '4.08' Or
CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER = '3.02')
And (case when CONSTRUCTION.MILESTONEEVENTS.MILESTONENUMBER = '4.08'
then CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE >= sysdate-365 END)
Group By CONSTRUCTION.CONTRACTS.CONTRACTNUMBER,
CONSTRUCTION.TBL_CONTRACTPROJECTCOMBO.LOCATIONS我得到的错误是
ORA-00905:缺失关键字.
此错误表示我的代码在CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE和">="之间中断。我做错了什么?
任何帮助都是非常感谢的。谢谢。
发布于 2021-10-11 12:44:36
我想你在这最后还有额外的支架。
then CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE >= to_date(to_char(sysdate, 'mm/dd/yyyy'), 'mm/dd/yyyy')-365) END)是否可以尝试再次删除和执行相同的查询。
发布于 2021-10-11 12:44:38
别名的存在是有道理的;我建议您使用它们,并使您编写的查询更容易阅读。
至于你遇到的一个问题:我相信这解决了一部分问题:
SELECT DISTINCT c.contractnumber,
m.milestone,
m.milestonedescription,
cm.milestonedate,
m.milestonenumber
FROM construction.contracts c
JOIN construction.contractmilestones cm ON cm.contractid = c.id
JOIN construction.milestoneevents m ON m.id = cm.milestoneid
WHERE cm.milestonedate >=
CASE WHEN m.milestonenumber = '4.08' THEN TRUNC (SYSDATE) - 365
ELSE DATE '2021-01-01' --> if it isn't 4.08, what should CM.MILESTONEDATE be larger than?
END您编写的CASE是错误的,因为它应该表示某些条件,而您的查询试图使用它,但是方式错误(不能在CASE中使用THEN )。
注意,我写了ELSE;我使用日期文字(2021年1月1日),因为我不知道您想对其他里程碑做什么(不同于4.08)。如果你这么做了(你应该,对吧?),把那个日期放进去。
https://stackoverflow.com/questions/69525755
复制相似问题