MySQL条件SELECT&根据条件计算值

时间:2016-06-13 10:46:24

标签: mysql

我有一张桌子,结构如下:

date (DATE)
time (TIME)
quantity_ok (INT)
quantity_ng (INT)
shift (INT)
target (DECIMAL)

它包含给定产品线的生产数据。其中的问题是,班次在00:00:00没有变化,而是在23:00:00(3班,07-15,15-23,23-07)。

在这张表中,我已经有了给定班次的“正确”日期(今天00:00:00 - 07:00:00之间的生产日期为昨天,因为它属于昨天的第3班)。

我必须根据这个想法计算目标的实际百分比:

(SUM(Quality_ok) for given shift) / (nr. of min. from the beginning of the shift)*target

我正在做的是:

SELECT
`date`,
SUM(quantity_ok) AS `SUM(quantity_ok)`,
(TIME_TO_SEC(NOW()) - TIME_TO_SEC('07:00:00'))/60*`target` AS actual_target,
SUM(quantity_ok)/((TIME_TO_SEC(NOW()) - TIME_TO_SEC('07:00:00'))/60*`target`)*100    AS `Actual % of target`,
`time`
FROM U126_td
WHERE (`date` = CURDATE())

上述工作正确地适用于第一班次,对于第二班次,它给出了实际百分比的总和(我需要它从15:00开始重置为零),并且它没有给出00:00-07:00的结果

我应该根据有条件的变化计算,但在这里我迷失了。

感谢您的回答!

编辑2: 因为我提出了似乎有用的东西:

SELECT
`date`, `time`, `actshift`,
SUM(quantity_ok) AS `SUM(quantity_ok)`,
MAX(shift) AS `MAX(shift)`,
MAX(`time`) AS `MAX(time)`,
CASE actshift WHEN  1 THEN
SUM(quantity_ok)/((TIME_TO_SEC(NOW()) - TIME_TO_SEC('07:00:00'))/60*`target`)*100 
          WHEN  2 THEN
SUM(quantity_ok)/((TIME_TO_SEC(NOW()) - TIME_TO_SEC('15:00:00'))/60*`target`)*100
                        WHEN  3 THEN
                                        CASE MAX(`time`) WHEN MAX(`time`)<'07:00:00' THEN
                                            SUM(quantity_ok)/((TIME_TO_SEC(NOW()) - TIME_TO_SEC('00:00:00'))/60*`target`)*100
                                                                        ELSE
                                            SUM(quantity_ok)/((TIME_TO_SEC(NOW()) - TIME_TO_SEC('23:00:00'))/60*`target`)*100
                                        END
END  AS `Actual % of target`
FROM U126_td
WHERE (`date` = CURDATE())

当然,所有这些shi(f)t都需要清理一下“ - ”

1 个答案:

答案 0 :(得分:0)

我需要一些样本数据和所需的输出才能提出完整的查询设计,但基本上你不需要计算班次的开始,甚至不需要计算你所处的班次来计算它的持续时间自转变开始以来。

你只需要在相关的时间值上加一小时来处理午夜的偏移量,然后在除以转换的长度后计算出余数。

-- How many seconds have passed since the current shift started?
SELECT TIME_TO_SEC(NOW() + INTERVAL 1 HOUR) % 28800;
-- Or in minutes:
SELECT FLOOR(TIME_TO_SEC(NOW() + INTERVAL 1 HOUR) / 60) % 480;