简体   繁体   English

Oracle SQL-计算列

[英]Oracle SQL - Computed column

I need some help in creating computed column called "Health_Stat" based on project Status, due date, completion date and sysdate. 我需要一些帮助,以根据项目状态,到期日,完成日期和sysdate创建名为“ Health_Stat”的计算列。 Am using Oracle db. 我正在使用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       |                                                                 |
+----------------+-----------------+---------------+-----------------------------------------------------------------+

Below is the table with data: 下表是数据表:

+-----------+------------+------------+----------------+
| 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     |
+-----------+------------+------------+----------------+

Here is the query I tried: 这是我尝试过的查询:

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 

Below is the result am getting: 以下是得到的结果:

+-----------+------------+------------+----------------+--------------+
| 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     | -            |
+-----------+------------+------------+----------------+--------------+

Am having trouble on how to include sysdate in case statement and how to change health_stat to "On Track" if 2 days before due date. 如果在到期日之前2天,如何在案例语句中包含sysdate以及如何将health_stat更改为“ On Track”时遇到了麻烦。 Since I have to compare project duedate with that of completion date and also sysdate. 由于我必须将项目的到期日与完成日期以及sysdate进行比较。 That's where am having trouble. 那就是麻烦所在。 Appreciate any help. 感谢任何帮助。

Thanks, 谢谢,
Richa 里查

Updating correct code in bold letters **: Thanks and credits to @MatBailie 用粗体字母更新正确的代码**:感谢和感谢@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 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM