I have a table :
x
------------------------
testId | runId |result
------------------------
**1 | 11 |0**
**1 | 12 |1**
**1 | 13 |1**
**1 | 14 |1**
**2 | 21 |0**
**3 | 31 |1**
**4 | 41 |1**
**4 | 42 |1**
**4 | 43 |1**
**5 | 51 |0**
**5 | 52 |0**
**5 | 53 |0**
**6 | 61 |1**
**6 | 62 |0**
**6 | 63 |1**
For a test there can be multiple run/execution. Each run have a result. here for result column, 0 is fail and 1 is pass. I want to query –if all the run PASS for test, the OverallStatus is PASS –If all the run Faile for a test, the OverallStatus is FAIL –If some of them pass and some of them fialed then OverallStaus is DEFECT
I want to get an output from the above table like
testId |numOfRun |OverallStatus
1 | 4 |Defect
2 | 1 |FAIL
3 | 1 |PASS
4 | 3 |PASS
5 | 3 |FAIL
6 | 3 |Defect
Advertisement
Answer
You can use conditional aggregation
select testId,
numOfRun,
case when numOfRun = pass then 'pass'
when numOfRun = fail then 'fail'
else 'defect'
end as OverallStatus
from (
select testId,
count(*) numOfRun,
sum(case when result = 0 then 1 else 0 end) as fail,
sum(case when result = 1 then 1 else 0 end) as pass
from table
group by testId
) t