1

我正在尝试编写一个查询,该查询将显示每月工作时间的持续时间矩阵。我正在努力实现这一目标。

在此处输入图像描述

我目前有这个。 在此处输入图像描述

正确的输出应该是 在此处输入图像描述

我的 SQL 是

`SELECT WEEK(start) as weekId,
                (
                    选择总和(TIME_TO_SEC(TIMEDIFF(停止,开始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(开始)=0
                ) 作为星期一,
                (
                    选择总和(TIME_TO_SEC(TIMEDIFF(停止,开始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(开始)=1
                ) 作为星期二,
                (
                    选择总和(TIME_TO_SEC(TIMEDIFF(停止,开始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(开始)=2
                ) 作为星期三,
                (
                    选择总和(TIME_TO_SEC(TIMEDIFF(停止,开始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(开始)=3
                ) 作为星期四,
                (
                    选择总和(TIME_TO_SEC(TIMEDIFF(停止,开始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(开始)=4
                ) 作为星期五,
                (
                    选择总和(TIME_TO_SEC(TIMEDIFF(停止,开始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(开始)=5
                ) 作为星期六,
                (
                    选择总和(TIME_TO_SEC(TIMEDIFF(停止,开始)))
                    FROM tbl_time_clock
                    WHERE WEEKDAY(开始)=6
                ) 作为星期天
            FROM tbl_time_clock
            WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
            按周分组(开始)`

表看起来像

╔═════════╦═════════════════════╦═════════════════ ════╗
║ user_id ║ 开始 ║ 停止 ║
╠═════════╬═════════════════════╬═════════════════ ════╣
║ 1 ║ 2012-08-28 08:14:49 ║ 2012-08-28 10:14:49 ║
║ 1 ║ 2012-08-25 10:00:32 ║ 2012-08-25 16:21:57 ║
╚═════════╩═════════════════════╩═════════════════ ════╝

谢谢!!!

4

2 回答 2

2

你不需要子查询。

通常只按两个字段分组,并让您的编程语言进行演示(创建表格):

SELECT 
    WEEK(start) as weekId,
    WEEKDAY(start) as weekDay,
    TIME_TO_SEC(TIMEDIFF(stop, start))
FROM tbl_time_clock
WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
GROUP BY WEEK(start), WEEKDAY(start)

如果你的 SQL 本身必须真的给出一个矩阵(但为什么?),试试这个:

SELECT 
    WEEK(start) as weekId,
    SUM( if( WEEKDAY(start)=0,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Monday,
    SUM( if( WEEKDAY(start)=1,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Tuesday,
    SUM( if( WEEKDAY(start)=2,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Wednesday,
    SUM( if( WEEKDAY(start)=3,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Thursday,
    SUM( if( WEEKDAY(start)=4,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Friday,
    SUM( if( WEEKDAY(start)=5,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Saturday,
    SUM( if( WEEKDAY(start)=6,TIME_TO_SEC(TIMEDIFF(stop, start))),0) as Sunday,
FROM tbl_time_clock
WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
GROUP BY WEEK(start)
于 2012-09-02T15:33:42.927 回答
0

看起来您需要在每个子查询中限制星期。为此,请为您的内部表添加一个别名,以便可以在内部查询中引用来自外部查询的值。Monday 子查询如下所示:

(
     SELECT SUM(TIME_TO_SEC(TIMEDIFF(stop, start)))
     FROM tbl_time_clock AS tbl_inner
     WHERE WEEKDAY(tbl_inner.start)=0
     AND WEEK(tbl_inner.start)=tbl_outer.week_start
) AS Monday

外部表应该在约束子查询执行之前进行分组,否则每周会有多个结果。因此,您的外部 FROM 子句应如下所示:

FROM (
    select WEEK(start) AS week_start FROM tbl_time_clock GROUP BY WEEK(start)
    WHERE MONTH(start) = {$monthId} AND user_id = {$userId}
) as tbl_outer

编辑:固定。另外,我同意 Konerak 的观点,可能不需要矩阵,他的 SQL 解决方案更好。留下这个,因为它展示了如何修改给定的 SQL 以获得解决方案。

于 2012-09-02T15:18:02.607 回答