首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >>= (date) Where子句中的PLSQL大小写

>= (date) Where子句中的PLSQL大小写
EN

Stack Overflow用户
提问于 2021-10-11 11:51:52
回答 2查看 70关注 0票数 0

我使用一个包含各种里程碑的表来确定合同的各个阶段。每个里程碑都有一个日期,我需要在其中几个里程碑上构建一份报告,以确定项目从一个阶段到另一个阶段的平均时间长度。这个表包含了从1996年到现在的信息,我只对过去一年中已经完成的项目(里程碑4.08)感兴趣。

麻烦的是,我似乎无法构建一个case语句来查找特定的里程碑,然后过滤对应于它的日期。下面是我正在处理的代码。

代码语言:javascript
复制
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">="之间中断。我做错了什么?

任何帮助都是非常感谢的。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-10-11 12:44:36

我想你在这最后还有额外的支架。

代码语言:javascript
复制
then CONSTRUCTION.CONTRACTMILESTONES.MILESTONEDATE >= to_date(to_char(sysdate, 'mm/dd/yyyy'), 'mm/dd/yyyy')-365) END)

是否可以尝试再次删除和执行相同的查询。

票数 0
EN

Stack Overflow用户

发布于 2021-10-11 12:44:38

别名的存在是有道理的;我建议您使用它们,并使您编写的查询更容易阅读。

至于你遇到的一个问题:我相信这解决了一部分问题:

代码语言:javascript
复制
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)。如果你这么做了(你应该,对吧?),把那个日期放进去。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69525755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档