【问题标题】:SQL Query including SUM and GROUPBY包括 SUM 和 GROUPBY 的 SQL 查询
【发布时间】:2014-03-25 13:34:50
【问题描述】:

我正在创建一个时间跟踪系统,但我正在努力处理一个相当复杂的 SQL 查询。

基本上,我想为当前记录工作会话的特定模块创建所有作业的列表,包括每个作业花费的总时间。

到目前为止,我使用TIMESTAMPDIFF() 比较StartTimeEndTime 列,以计算在该特定工作会话上花费的总时间为TimeSpent。但是,我很难理解如何将工作会话按 AssignmentID 分组,然后将 SUM() 所有 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   

【问题讨论】:

  • 考虑提供适当的 DDL(和/或 sqlfiddle)以及所需的结果集。另外,请注意,您的 WHERE 条件将 t3 呈现为 INNER JOIN。如果您需要 OUTER JOIN,请将其移至 JOIN 子句。
  • 您需要在 group by 子句中包含 select 中的所有列才能使其正常工作。还要查看 Group By Grouping Sets((All columns))
  • @Jaypal MySQL 允许选择 GROUP BY 中未列出的列,它返回相应组中的任何值。
  • 请告诉我们您的问题。在我看来,你的陈述应该有效。不是吗?
  • @ThorstenKettner 最初我的结果显示 TimeSpent 列的一些负数。然而,在回顾我的 work_session 表后,我意识到一些 StartTimes 实际上是在 EndTimes 之后。正如您所说,该声明本身是正确的并且运行良好。我只是忽略了检查数据本身是否正确。非常感谢让我重新回到原来的方向!

标签: mysql sql datetime group-by sum


【解决方案1】:

要获得总数,请使用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 |
+------+-------------+

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 2019-09-22
    • 2021-01-01
    • 2015-10-06
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    • 2015-10-30
    • 2012-01-25
    相关资源
    最近更新 更多