in my table I have a column for a project which can have multiple project milestones (second column). Each of the milestone can have the value ‘fullfilled’ or ‘pending’ as current_status (third column). Now I want to aggregate the overall status of each project and assign it a final status (new virtual column) for better overview.
The following rule should apply:
If every milestone is fullfiled then the status of a project should change to ‘Finished’
If one or more milestones are pending then the status of project should be ‘On-Hold’
Meaning that I want to checklist every current status per project to get a final_status.
Any idea how to do this with a case-when-clause or something similar?
Thank you.
Kind regards.
Advertisement
Answer
If there are only two statuses, then check whether the only status is ‘finished’.
Sample data in lines #1 – 9:
- project 1 is finished as its all milestone statuses are “fulfilled”
- project 2 is still on hold as only milestone is “fulfilled”
SQL> with project (projno, mileno, milestatus) as
2 (select 1, 1, 'fulfilled' from dual union all
3 select 1, 2, 'fulfilled' from dual union all
4 select 1, 3, 'fulfilled' from dual union all
5 --
6 select 2, 1, 'fulfilled' from dual union all
7 select 2, 2, 'pending' from dual union all
8 select 2, 3, 'pending' from dual
9 )
10 select projno,
11 case when min_status = max_status and
12 max_status = 'fulfilled'
13 then 'Finished'
14 else 'On hold'
15 end project_status
16 from (select projno,
17 min(milestatus) min_status,
18 max(milestatus) max_status
19 from project
20 group by projno
21 );
PROJNO PROJECT_
---------- --------
1 Finished
2 On hold
SQL>