2014-03-25 75 views
0

我正在創建一個時間跟蹤系統,並且我正在努力處理一個相當複雜的SQL查詢。SQL查詢包括SUM和GROUPBY

基本上我想創建一個列表,列出當前已記錄工作會話的特定模塊的所有賦值,包括每個賦值花費的總時間。

到目前爲止,我已經使用TIMESTAMPDIFF()比較StartTimeEndTime列計算花費在那個特定的工作會話TimeSpent的總時間。然而,我很努力地理解,我將如何將AssignmentIDSUM()所有TimeSpent列的工作會話分組在一起以給出總計。

這是我到目前爲止構建的。

SELECT t2.*, 
SUM(TIMESTAMPDIFF(second, t1.StartTime, t1.EndTime)) AS TimeSpent 
FROM work_session t1 
LEFT JOIN assignment t2 ON t1.AssignmentID = t2.AssignmentID 
LEFT JOIN module t3 ON t2.ModuleID = t3.ModuleID 
LEFT JOIN course t4 ON t3.CourseID = t4.CourseID 
WHERE t2.ModuleID = 3 
GROUP BY t1.AssignmentID 
+0

考慮提供適當的DDL(和/或一個平方根)與DE一起SIRED結果集。另外,請注意您的WHERE條件將t3作爲INNER JOIN呈現。如果您想要一個OUTER JOIN,請將其移至JOIN子句。 – Strawberry

+0

您需要在group by子句中包含select中的所有列才能使其工作。另請參閱Group By Grouping Sets((所有列)) – Jaypal

+1

@Jaypal MySQL允許選擇未在GROUP BY中列出的列,它會返回相應組中的任何值。 – Vatev

回答

0

得到總的,使用WITH ROLLUP爲 「超級彙總」 數據:

SELECT t2.*, 
SUM(TIMESTAMPDIFF(second, t1.StartTime, t1.EndTime)) AS TimeSpent 
FROM work_session t1 
LEFT JOIN assignment t2 ON t1.AssignmentID = t2.AssignmentID 
LEFT JOIN module t3 ON t2.ModuleID = t3.ModuleID 
LEFT JOIN course t4 ON t3.CourseID = t4.CourseID 
WHERE t2.ModuleID = 3 
GROUP BY t1.AssignmentID 
WITH ROLLUP 

從文檔:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year; 
+------+-------------+ 
| year | SUM(profit) | 
+------+-------------+ 
| 2000 |  4525 | 
| 2001 |  3010 | 
+------+-------------+ 

與彙總:

mysql> SELECT year, SUM(profit) FROM sales GROUP BY year WITH ROLLUP; 
+------+-------------+ 
| year | SUM(profit) | 
+------+-------------+ 
| 2000 |  4525 | 
| 2001 |  3010 | 
| NULL |  7535 | 
+------+-------------+