php - MySQL - 对项目的时间条目进行分组和汇总

标签 php mysql

我从 toggl.com 获得了这些时间记录数据,我需要将报告的格式设置为与他们提供的稍有不同 - 这就是为什么我认为我应该尝试将 csv 数据导入 MySQL 并对其进行分组和格式化我自己通过 MySQL 和 PHP 等,但我几乎在开始之前就陷入了困境 - 将数据导入 MySQL,所以现在我需要将其输出到 html 表中......不知何故。

我有这些数据:

+-----------+---------------------------------------+------------+----------+
|  Project  |                 Task name             |    Date    | Duration |
+-----------+---------------------------------------+------------+----------+
| Project 1 | Task name 2                           | 2016-05-12 | 00:22:03 |
| Project 2 | Task name 1                           | 2016-05-12 | 00:04:24 |
| Project 2 | Task name 1                           | 2016-05-12 | 00:06:27 |
| Project 1 | 3. correction                         | 2016-05-13 | 00:08:00 |
| Project 1 | Small correction                      | 2016-05-13 | 00:02:02 |
| Project 1 | Last correction                       | 2016-05-16 | 00:05:36 |
| Project 1 | Created low-res                       | 2016-05-16 | 00:04:21 |
| Project 2 | Layout                                | 2016-05-24 | 00:27:45 |
| Project 2 | Layout                                | 2016-05-25 | 01:00:00 |
| Project 2 | Finishing                             | 2016-05-25 | 00:15:48 |
+-----------+---------------------------------------+------------+----------+

我梦想实现的是每个项目的数据如下所示:

Project 2  
-----------------------------------------------------
Date            Tasks                     Total
-----------------------------------------------------
12/05/16        Task name 1               00:10:51
24/05/16        Layout                    00:27:45
25/05/16        Layout, Finishing         01:15:48
-----------------------------------------------------
Project 2 total                           01:54:24

因此,对于每个项目,每个日期都应该有自己的行,包括日期任务名称 (逗号分隔)以及该日期持续时间总和

然后是项目总数。

任何帮助将不胜感激! :-)

编辑:

SELECT 
     Project,
     `Task name`,
     Date,
     Duration,
     SEC_TO_TIME( SUM( TIME_TO_SEC( `Duration` ) ) ) AS TotalDuration 
     FROM timerecordings
     GROUP BY Project, Date, `Task name` WITH ROLLUP

给我(不要看日期和时间格式,这是 Excel 做的):

+-----------+------------------+------------+----------+----------+
| Project 1 | Task name 2      | 12/05/2016 | 00.22.03 | 00.22.03 |
| Project 1 | NULL             | 12/05/2016 | 00.22.03 | 00.22.03 |
| Project 1 | 3. correction    | 13/05/2016 | 00.08.00 | 00.08.00 |
| Project 1 | Small correction | 13/05/2016 | 00.02.02 | 00.02.02 |
| Project 1 | NULL             | 13/05/2016 | 00.02.02 | 00.10.02 |
| Project 1 | Created low-res  | 16/05/2016 | 00.04.21 | 00.04.21 |
| Project 1 | Last correction  | 16/05/2016 | 00.05.36 | 00.05.36 |
| Project 1 | NULL             | 16/05/2016 | 00.05.36 | 00.09.57 |
| Project 1 | NULL             | NULL       | 00.05.36 | 00.42.02 |
| Project 2 | Task name 1      | 12/05/2016 | 00.04.24 | 00.10.51 |
| Project 2 | NULL             | 12/05/2016 | 00.04.24 | 00.10.51 |
| Project 2 | Layout           | 24/05/2016 | 00.27.45 | 00.27.45 |
| Project 2 | NULL             | 24/05/2016 | 00.27.45 | 00.27.45 |
| Project 2 | Finishing        | 25/05/2016 | 00.15.48 | 00.15.48 |
| Project 2 | Layout           | 25/05/2016 | 01.00.00 | 01.00.00 |
| Project 2 | NULL             | 25/05/2016 | 01.00.00 | 01.15.48 |
| Project 2 | NULL             | NULL       | 01.00.00 | 01.54.24 |
| NULL      | NULL             | NULL       | 01.00.00 | 02.36.26 |
+-----------+------------------+------------+----------+----------+

最佳答案

您可以使用GROUP_CONCAT聚合函数将所有任务名称组合到一个字符串中。使用 SEPARATOR 关键字定义分隔符(默认值:',')。如果您不希望多次列出同一任务,请使用 DISTINCT

对于一个项目:

SELECT Date,
  GROUP_CONCAT(DISTINCT `Task name` SEPARATOR ', ') AS Task,
  SEC_TO_TIME(SUM(TIME_TO_SEC(Duration))) AS Total
FROM timerecordings r
WHERE Project = 'Project 2'
GROUP BY Date WITH ROLLUP;

对于所有项目:

SELECT SELECT Project, Date, 
  GROUP_CONCAT(DISTINCT `Task name` SEPARATOR ', ') AS Task,
  SEC_TO_TIME(SUM(TIME_TO_SEC(Duration))) AS Total
FROM timerecordings r
GROUP BY Project, Date WITH ROLLUP;

sqlfiddle

关于php - MySQL - 对项目的时间条目进行分组和汇总,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460570/

相关文章:

php - 转换成安全的 PDO 语句?

php - php 在使用指定键直接访问数组行时的性能是什么

php - SQL首先获取一会儿选择的id,然后从表中获取其他的?

c# - 如何正确封装对具有(几乎)相同模式的不同数据库系统的访问?

mysql - 批量导入数据到mysql,不指定文件扩展名

php - MySQL通过关系表连接

php - Mysql插入空数据的最佳方法是什么

php - DOM PDF 在 Mac 上呈现,但在 PC 上不呈现

mysql - 使用 MySQL 从数据库中获取仅保留 2 位小数的值

php - 从 mysql json 数据中剪切文本