2014-03-25 74 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 | 
+------+-------------+