2014-11-04 57 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