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
我需要一些帮助来根据项目状态、截止日期、完成日期和系统日期创建名为 "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