Task:
id | title | description | --------------------------------------------------------------------- 1 | Task1 | Descr1 | 2 | Task2 | Descr1 | 3 | Task2 | Descr1 | 4 | Task2 | Descr1 | 5 | Task2 | Descr1 |
Message:
id | task_id | message | status | --------------------------------------------------------------------- 1 | 1 | Message1 | HOLD 2 | 1 | Message2 | OK 3 | 1 | Message3 | ERROR 4 | 1 | Message4 | ERROR 5 | 2 | Message5 | HOLD 6 | 2 | Message6 | OK 7 | 2 | Message7 | OK 8 | 2 | Message7 | OK 9 | 3 | Message7 | OK
I want to show as here:
id | title | description | count(HOLD) | count(OK) | count(ERROR) --------------------------------------------------------------------- 1 | Task1 | Descr1 | 1 | 1 | 2 2 | Task2 | Descr1 | 1 | 3 | 0 3 | Task2 | Descr1 | 0 | 1 | 0 4 | Task2 | Descr1 | 0 | 0 | 0 5 | Task2 | Descr1 | 0 | 0 | 0
Advertisement
Answer
You could use a selective aggregation baded on sum and CASE when
select task.id , task.title , task.description , sum(case when Message.status = 1 then 1 else 0 end ) status1 , sum(case when Message.status = 2 then 1 else 0 end ) status2 , sum(case when Message.status = 3 then 1 else 0 end ) status3 from Task INNER JOIN Message ON Task.id = Message.task_id group by task.id , task.title , task.description