我有两个表用户和任务。我需要获取按Users.Name和Tasks.Status分组的任务计数。我需要一些帮助编写查询以使我的结果看起来与第三个表类似。
用户
|- Id -|- Name -|
|- 1 -|- Robert -|
|- 2 -|- Bob -|
|- 3 -|- Vicky -|
|- 4 -|- Don -|
|- 5 -|- Ron -|
|- 6 -|- Harry -|
任务
|- 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 -|
结果
|- 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 -|
答案 0 :(得分:4)
如果你想在答案中得到零,你需要先生成行。以下是获取结果的方法:
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;
请注意,这是标准SQL,因此它适用于代码中的所有数据库。
答案 1 :(得分:0)
选择姓名,状态,计数(姓名,状态) 来自users.id = tasks.userid上的用户内部联接任务 按名称分组,状态
沿着这些方向,我生锈了
答案 2 :(得分:0)
你可以拥有一张状态表'因为并非所有用户都拥有处于所有状态的任务。如果没有这个,或者选择常量,你需要使用子查询来获取各种状态的列表。这可能会很慢。
您可以生成一个列表并与用户交叉加入,然后将这两个加入任务。
这样的事情: -
SELECT users.name, statii.status, COUNT(tasks.id)
FROM users
CROSS JOIN
(
SELECT 'Started' AS status UNION SELECT 'Complete'
) statii
LEFT OUTER JOIN tasks
ON users.Id = tasks.user_id
AND statii.status = tasks.status
GROUP BY users.name, statii.status