SQL查询:按不同表中的多个列分组

Vip*_*pal 1 mysql sql postgresql activerecord mysqli

我有两个表用户和任务。我需要获取按Users.Name和Tasks.Status分组的任务计数。我需要一些帮助编写查询来使我的结果与第三张表相似。

用户数

|- Id -|- Name   -|
|- 1  -|- Robert -|
|- 2  -|- Bob    -|
|- 3  -|- Vicky  -|
|- 4  -|- Don    -|
|- 5  -|- Ron    -|
|- 6  -|- Harry  -|
Run Code Online (Sandbox Code Playgroud)

任务

|- Id -|- Status     -|- user_id -|
|- 1  -|- Started    -|- 1       -|
|- 2  -|- Started    -|- 1       -|
|- 3  -|- Started    -|- 2       -|
|- 4  -|- Started    -|- 2       -|
|- 3  -|- Complete   -|- 1       -|
|- 4  -|- Complete   -|- 1       -|
|- 5  -|- Complete   -|- 2       -| 
|- 6  -|- Complete   -|- 2       -|
Run Code Online (Sandbox Code Playgroud)

结果

|- Name   -|- Status   -|- Count -|
|- Robert -|- Complete -|- 2     -|
|- Robert -|- Started  -|- 2     -|
|- Bob    -|- Complete -|- 2     -|
|- Bob    -|- Started  -|- 2     -|
|- Vicky  -|- Complete -|- 0     -|
|- Vicky  -|- Started  -|- 0     -|
|- Don    -|- Complete -|- 0     -|
|- Don    -|- Started  -|- 0     -|
|- Ron    -|- Complete -|- 0     -|
|- Ron    -|- Started  -|- 0     -|
|- Harry  -|- Complete -|- 0     -|
|- Harry  -|- Started  -|- 0     -|
Run Code Online (Sandbox Code Playgroud)

Gor*_*off 5

如果要在答案中得到零,则需要首先生成行。这是一种获取结果的方法:

select u.name, s.status, count(t.userid) as cnt
from users u cross join
     (select distinct status from tasks) s left join
     tasks t
     on t.userid = u.id and t.status = s.status
group by u.name, s.status
order by u.name, s.status;
Run Code Online (Sandbox Code Playgroud)

请注意,这是标准SQL,因此它将在您标记中的所有数据库中运行。