Richa
Richa

Reputation: 449

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. Am using Oracle db.

+----------------+-----------------+---------------+-----------------------------------------------------------------+
| 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. Since I have to compare project duedate with that of completion date and also sysdate. That's where am having trouble. Appreciate any help.

Thanks,
Richa

Updating correct code in bold letters **: Thanks and credits to @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

Upvotes: 0

Views: 2632

Answers (1)

MatBailie
MatBailie

Reputation: 86775

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 

Upvotes: 1

Related Questions