Reputation: 449
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
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