2014-11-04 23 views
-1

我有两个表用户和任务。我需要获得由Users.Name和Tasks.Status分组的任务数。我需要一些帮助来编写查询,以使我的结果看起来类似于第三个表。SQL查询:由不同表中的多列组成

用户

|- 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  -| 

回答

3

如果你想在T zaeros他回答说,你需要先生成行。下面是获得结果的方法:

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因此它会在你的代码中的所有数据库工作。

0

选择名称,状态,计数(名称,状态) 从用户内部联接任务上users.id = tasks.userid 组的名称,状态

类似的规定,我很生疏

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