2016-06-13 37 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