Oracle SQL - 计算列

Oracle SQL - Computed column

我需要一些帮助来根据项目状态、截止日期、完成日期和系统日期创建名为 "Health_Stat" 的计算列。我正在使用 Oracle 数据库。

+----------------+-----------------+---------------+-----------------------------------------------------------------+
| Project Status |    Due Date     | Health_Stat |                              Notes                              |
+----------------+-----------------+---------------+-----------------------------------------------------------------+
| Planning       | Before due date | Not Required  |                                                                 |
| Planning       | After due date  | Not Required  |                                                                 |
| Cancelled      | Before due date | Not Required  |                                                                 |
| Cancelled      | After due date  | Not Required  |                                                                 |
| In Process     | Before due date | On Track      | 2 Days before due date "Health_Stat" should change to "At Risk" |
| In Process     | After due date  | Overdue       |                                                                 |
| On Hold        | Before due date | On Track      | 2 Days before due date "Health_Stat" should change to "At Risk" |
| On Hold        | After due date  | Overdue       |                                                                 |
| Complete       | Before due date | On Track      |                                                                 |
| Complete       | After due date  | Overdue       |                                                                 |
+----------------+-----------------+---------------+-----------------------------------------------------------------+

下面是 table 数据:

+-----------+------------+------------+----------------+
| PROJECTID |   STATUS   |  DUE_DATE  | COMPLETED_DATE |
+-----------+------------+------------+----------------+
|     10135 | Complete   | 5/31/2016  | 5/31/2016      |
|     10138 | Complete   | 8/31/2016  |                |
|     10259 | Complete   | 4/30/2017  | 5/5/2017       |
|     10335 | Complete   | 7/31/2017  | 8/31/2017      |
|     10340 | On Hold    | 12/15/2017 | 11/30/2017     |
|     10356 | Complete   | 9/7/2017   | 9/7/2017       |
|     10404 | Cancelled  | 10/22/2017 | 11/6/2017      |
|     10433 | In Process | 11/8/2017  | 2/2/2018       |
|     10443 | Planning   | 11/22/2017 | 11/14/2017     |
|     10455 | Planning   | 12/15/2017 | 12/13/2017     |
+-----------+------------+------------+----------------+

这是我试过的查询:

SELECT projectid, 
       status, 
       due_date, 
       Trunc(completed_date) AS completed_date, 
       CASE 
         WHEN status IN ( 'In Process', 'On Hold', 'Complete' ) 
              AND due_date <= Trunc(completed_date) THEN 'On Track' 
         WHEN status IN ( 'In Process', 'On Hold', 'Complete' ) 
              AND due_date > Trunc(completed_date) THEN 'Overdue' 
         WHEN ( status IN ( 'Planning', 'Cancelled' ) ) THEN '' 
       END                   AS Health_Stat 
FROM   project_tracker 
ORDER  BY projectid 

下面是我得到的结果:

+-----------+------------+------------+----------------+--------------+
| PROJECTID |   STATUS   |  DUE_DATE  | COMPLETED_DATE | HEALTH_CHECK |
+-----------+------------+------------+----------------+--------------+
|     10135 | Complete   | 5/31/2016  | 5/31/2016      | On Track     |
|     10138 | Complete   | 8/31/2016  | -              | -            |
|     10259 | Complete   | 4/30/2017  | 5/5/2017       | On Track     |
|     10335 | Complete   | 7/31/2017  | 8/31/2017      | On Track     |
|     10340 | On Hold    | 12/15/2017 | 11/30/2017     | Overdue      |
|     10356 | Complete   | 9/7/2017   | 9/7/2017       | On Track     |
|     10404 | Cancelled  | 10/22/2017 | 11/6/2017      | -            |
|     10433 | In Process | 11/8/2017  | 2/2/2018       | On Track     |
|     10443 | Planning   | 11/22/2017 | 11/14/2017     | -            |
|     10455 | Planning   | 12/15/2017 | 12/13/2017     | -            |
+-----------+------------+------------+----------------+--------------+

我遇到了如何在 case 语句中包含 sysdate 以及如何在截止日期前 2 天将 health_stat 更改为 "On Track" 的问题。因为我必须将项目截止日期与完成日期以及系统日期进行比较。那就是我遇到麻烦的地方。感谢任何帮助。

谢谢,
里查

更新正确的粗体代码**: 感谢@MatBailie

SELECT projectid, 
       status, 
       due_date, 
       Trunc(completed_date) AS completed_date, 
       CASE 
         WHEN status IN ( 'In Process', 'On Hold', 'Complete' ) 
              AND due_date **>=** Trunc(completed_date) THEN 'On Track' 
         WHEN status IN ( 'In Process', 'On Hold', 'Complete' ) 
              AND due_date **<=** Trunc(completed_date) THEN 'Overdue' 
         WHEN ( status IN ( 'Planning', 'Cancelled' ) ) THEN '' 
         WHEN status IN ( 'In Process', 'On Hold' ) 
              AND due_date >= **SYSDATE** + 2 THEN 'On Track' 
         ELSE '?' 
       END                   AS Health_Stat 
FROM   project_tracker 
ORDER  BY projectid
SELECT projectid, 
       status, 
       due_date, 
       Trunc(completed_date) AS completed_date, 
       CASE 
         WHEN status IN ( 'In Process', 'On Hold', 'Complete' ) 
              AND due_date <= Trunc(completed_date) THEN 'On Track' 
         WHEN status IN ( 'In Process', 'On Hold', 'Complete' ) 
              AND due_date > Trunc(completed_date) THEN 'Overdue' 
         WHEN ( status IN ( 'Planning', 'Cancelled' ) ) THEN '' 
         WHEN status IN ( 'In Process', 'On Hold' )
              AND due_date >= SYS_DATE + 2 THEN 'On Track'
                                           ELSE '?'
       END                   AS Health_Stat 
FROM   project_tracker 
ORDER  BY projectid