Mysql 按天分组和合计工作小时数

Mysql 按天分组和合计工作小时数,mysql,Mysql,我正在写一个管理工作时间的软件。每一天都可能有不同的活动。 我希望提取每个工人在过去7天的工作时间 样本行 +----+------------+-------+----------+----------+ | id | date | order | operator | duration | +----+------------+-------+----------+----------+ | 37 | 2016-06-12 | 27 | 1 | 18

我正在写一个管理工作时间的软件。每一天都可能有不同的活动。 我希望提取每个工人在过去7天的工作时间

样本行

+----+------------+-------+----------+----------+
| id |    date    | order | operator | duration |
+----+------------+-------+----------+----------+
| 37 | 2016-06-12 |    27 |        1 |      180 |
| 38 | 2016-06-12 |    28 |        3 |      390 |
| 39 | 2016-06-12 |    27 |        1 |      480 |
| 40 | 2016-06-04 |    21 |        2 |      120 |
| 41 | 2016-05-07 |    27 |        1 |       90 |
| 42 | 2016-06-07 |    27 |        1 |      150 |
+----+------------+-------+----------+----------+
查询

SELECT SUM(`duration`) as `hours_per_day`
FROM `sheets`
WHERE `operator` = 1 AND `date` = DATE_ADD(CURDATE(), INTERVAL -7 DAY)
ORDER BY `date` DESC
预期结果:

+------------------------+--------+--------+--------+--------+--------+--------+--------+
| Operator: Avareage Joe                                                                |
+------------------------+--------+--------+--------+--------+--------+--------+--------+
| Day:                   | 01 jul | 02 jul | 03 jul | O4 jul | 05 jul | 06 jul | 07 jul |
| Hours:                 | 8      | 7      | 9      | 8      | 9      | 8      | 6      |
+------------------------+--------+--------+--------+--------+--------+--------+--------+

让我们这样试一下:

SELECT    operator, `date`, (SUM(duration) / 60) as hours_per_day
FROM      sheets
WHERE     `date` > NOW() - INTERVAL 7 DAY
GROUP BY  operator, date
ORDER BY  operator, date
 operator | date         | hours_per_day
 ---------------------------------------
 1        | 2016-07-01   | 4
 1        | 2016-07-02   | 6
 1        | 2016-07-03   | 6
 2        | 2016-07-01   | 8
 2        | 2016-07-02   | 7
首先看一下
WHERE
子句。我们排除所有超过7天的产品

然后我们使用
groupby
获取所有剩余的行,并按操作符和日期对它们进行分组,这样基本上可以得到可以使用的小个子结果

我保留了您的
SUM(duration)
操作,它现在为这些小结果中的每一个计算总和。我刚刚添加了除法,因为很明显,您存储的是分钟,而不是小时

最后,我们使用orderby来确保结果不会看起来一团糟

您的结果应该如下所示:

SELECT    operator, `date`, (SUM(duration) / 60) as hours_per_day
FROM      sheets
WHERE     `date` > NOW() - INTERVAL 7 DAY
GROUP BY  operator, date
ORDER BY  operator, date
 operator | date         | hours_per_day
 ---------------------------------------
 1        | 2016-07-01   | 4
 1        | 2016-07-02   | 6
 1        | 2016-07-03   | 6
 2        | 2016-07-01   | 8
 2        | 2016-07-02   | 7

SELECT 
 CURDATE(),
 SUM(CASE WHEN CURDATE()                  = `date` THEN `duration` ELSE 0 END) as today    ,    
 SUM(CASE WHEN CURDATE() - INTERVAL 1 DAY = `date` THEN `duration` ELSE 0 END) as yesterday,
 SUM(CASE WHEN CURDATE() - INTERVAL 2 DAY = `date` THEN `duration` ELSE 0 END) as `today - 2`,
 SUM(CASE WHEN CURDATE() - INTERVAL 3 DAY = `date` THEN `duration` ELSE 0 END) as `today - 3`, 
 SUM(CASE WHEN CURDATE() - INTERVAL 4 DAY = `date` THEN `duration` ELSE 0 END) as `today - 4`,
 SUM(CASE WHEN CURDATE() - INTERVAL 5 DAY = `date` THEN `duration` ELSE 0 END) as `today - 5`,
 SUM(CASE WHEN CURDATE() - INTERVAL 6 DAY = `date` THEN `duration` ELSE 0 END) as `today - 6`
FROM `work`
where operator = 1
输出


这将需要使用常规SQL或动态SQL进行大型(且难看)pivot查询,并且存在操作员在过去七天中有一天或更长时间没有数据的问题。为此,您可以使用日历表。还有一个小提示:如果您避免使用保留字作为标识符,那么您的查询看起来就不会那么“棘手”。)