使用if语句无效使用组函数

问题描述 投票:-1回答:1

我使用此SQL获得“无效使用组函数”错误

SELECT 
  SUM(overTime) AS overTimeTotal 
  FROM (
    SELECT
    SUM(IF(
      SUM(TIMESTAMPDIFF(SECOND, starttid, sluttid)) >= TIME_TO_SEC('07:24:00:0000'),
      SUM(TIMESTAMPDIFF(SECOND, starttid, sluttid) - TIME_TO_SEC('07:24:00:0000')),
      0)) AS overTime
    FROM hours
    WHERE user_id = :id
    AND month(starttid) = :selectedMonth) AS T

表结构和数据:

INSERT INTO `hours` (`id`, `user_id`, `starttid`, `sluttid`) VALUES
(89, 1, '2018-05-09 05:00:00', '2018-05-09 16:00:00'),
(90, 1, '2018-05-08 05:00:00', '2018-05-08 10:00:00');

所以我正在尝试使用这个sql是为了获得总加班时间,但是当我有负加班时,如在ID 90(2:24:0000) - 它从总加班时间减去,这不是我想要的。如果加时为负,我想将SUM设置为零 - 这样我才能获得实际的加班时间。在这种情况下,我期望的加班结果是:3:36:0000,但我得到1:12:0000。所以我一直试图解决这个问题,现在我遇到了标题中描述的错误。

我该怎么做,我想要什么?

php mysql
1个回答
1
投票

看起来你太快聚集了。

看起来你想计算每一行的加班时间,然后进行聚合。

 SELECT SUM( 
          IF( TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid) >= TIME_TO_SEC('07:24:00:0000')
            , TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid)  - TIME_TO_SEC('07:24:00:0000')
            , 0
          )  
        ) AS overtimetotal
   FROM hours h
  WHERE h.user_id = :id
    AND MONTH(h.startid) = :selectedMonth

要进行测试,请删除聚合SUM()函数,并返回其他列

 SELECT IF( TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid) >= TIME_TO_SEC('07:24:00:0000')
            , TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid)  - TIME_TO_SEC('07:24:00:0000')
            , 0
        )  AS overtime

      , GREATEST(0,
          TIMESTAMPDIFF(SECOND, h.starttid, h.sluttid)  - TIME_TO_SEC('07:24:00:0000')
        ) AS alt_overtime

      , h.id
      , h.starttid
      , h.sluttid
   FROM hours h
  WHERE h.user_id = :id
    AND ... 

我还建议在WHERE子句的谓词中使用裸列,而不是在列上运行函数。使用文字侧的表达式返回与列数据类型匹配的datetime数据类型,例如

    AND h.startid  >= dt_month_begin + INTERVAL 0 MONTH
    AND h.startid  <  dt_month_begin + INTERVAL 1 MONTH
© www.soinside.com 2019 - 2024. All rights reserved.