2016-06-13 36 views
1

我有一个表的值,与该结构:MySQL的条件SELECT&计算基于条件

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

我在做什么是这样的:

​​

上述作品为第一班正确地说,对于第二班,它给出了实际百分比的总和(我需要它从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()) 

当然,这一切的市(F)T需要被清洗一 “位” :-)

回答

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; 
+0

嗨马特在这里你有我的实际表,截至2016年6月7日07:04:00。 [链接](https://drive.google.com/file/d/0B4B9GxnbFt6UVG8wNE5iT0IyX00/view?usp=sharing)表格每分钟更新一次,并带有产品。数据。每次查询运行时,我都需要返回目标的实际百分比。 – Kestabacsi

+0

谢谢,但我恐怕根本不了解最终要求。也许你可以编辑问题来包含你的样本数据的期望输出? –

+0

嗨最后的要求是只有一个数字(百分比),每次查询运行时重新计算。表格数据以来自传感器的数据(quantity_ok,quantity_ng)更新一次/分钟。无论如何,我想我解决了它:我在最后插入一列,与实际转变nr:'code'如果(HOUR(NOW())> = 7和HOUR(NOW())<15,1,(IF (HOUR(NOW())> = 15和HOUR(NOW())<23,2,3))) – Kestabacsi