2016-01-06 79 views
0

所以我需要一點幫助。我似乎無法找到正確的JOIN或任何我需要的東西,以便獲得我正在尋找的所有結果。MySQL查詢缺少行

我的當前查詢如下:

SELECT 
    COUNT(hd.value) as total_rows, 
    ROUND(AVG(hd.value), 2) as OEE_AVG, 
    dl.line_id, 
    hd.shift, 
    ol.description 
FROM 
    dashboard_to_dashboard_lines ddl 
JOIN dashboard_lines dl ON dl.id = ddl.dashboard_line_id 
LEFT OUTER JOIN operation_lines ol ON (dl.line_id = ol.line_id) 
JOIN historical_data hd ON dl.gauge_tag_id = hd.tag_id 
WHERE 
    hd.timestamp BETWEEN '2016-01-04 00:00:00' AND '2016-01-04 23:59:59' 
    AND ddl.dashboard_id = 1 
    AND hd.value < 200 
GROUP BY 
    dl.line_id, 
    hd.shift 
ORDER BY 
    hd.shift, 
    dl.line_id ASC 

期望的結果將如下所示:

________________________________________________________ 
| total rows | oee_avg | line_id | shift | description | 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 
| 858  | 80.24 | 1  | 1 | Line Desc | 
| 432  | 60.21 | 2  | 1 | Line Desc | 
| 234  | 70.75 | 3  | 1 | Line Desc | 
| 865  | 10.45 | 1  | 2 | Line Desc | 
| 864  | 20.26 | 2  | 2 | Line Desc | 
| 823  | 30.44 | 3  | 2 | Line Desc | 
| 423  | 56.14 | 1  | 3 | Line Desc | 
| 234  | 12.74 | 2  | 3 | Line Desc | 
| 534  | 43.64 | 3  | 3 | Line Desc | 

基本上,我得到用於與通過分開的儀表盤相關聯的每個線路的值平均轉移。

我主要得到我需要的數據,除了1行之外,所提供的時間範圍爲1班。 (其他時間框架提供所有班次的所有線路的預期結果)。所以我假設沒有數據在那裏導致行被遺漏的計算。

我試着做一個外部聯接(混合並在整個查詢中匹配),沒有任何運氣。

我知道沒有SQL小提琴很難,但我希望有人可能有一些洞察力,可以幫助我。

在此先感謝。

SQL Fiddle

編輯:新增SQL小提琴鏈接

+0

您的表格模式在這裏會很有幫助。 –

+0

添加鏈接到SQL提琴與這些表的模式 – Imperialized

回答

0

沒有我無法測試樣本數據,但這應該指向你在正確的方向,如果它完全不起作用。重要的部分是你需要所有可能的線/移位組合的來源。在這種情況下,我使用了一個子查詢來對付你的表,而不受日期等的限制,但你可能有更好的方法來獲取這些。此外,在類似情況下,您仍然希望在報表上查看某些值的數據可能根本不存在。例如,如果我報告的是白天的銷售情況,並且商店在週日關閉了,但我仍然希望在當天看到零。在這種情況下,除了從現有表格中進行選擇外,還需要以其他方式創建值。

SELECT 
    COUNT(hd2.value) AS total_rows, 
    ROUND(AVG(hd.value), 2) AS OEE_AVG, 
    SQ.line_id, 
    SQ.shift, 
    OL.description 
FROM 
    (
     SELECT DISTINCT dl.line_id, hd.shift 
     FROM dashboard_lines dl 
     INNER JOIN historical_data hd ON hd.tag_id = dl.gauge_tag_id 
    ) SQ 
INNER JOIN dashboard_to_dashboard_lines ddl ON ddl.dashboard_id = 1 
LEFT OUTER JOIN dashboard_lines dl2 ON 
    dl2.id = ddl.dashboard_line_id AND 
    dl2.line_id = SQ.line_id 
LEFT OUTER JOIN historical_data hd2 ON 
    hd2.tag_id = dl.gauge_tag_id AND 
    hd2.shift = SQ.shift AND 
    hd2.timestamp BETWEEN '2016-01-04 00:00:00' AND '2016-01-04 23:59:59' AND 
    hd2.value < 200 
LEFT OUTER JOIN operation_lines ol ON ol.line_id = dl2.line_id 
GROUP BY 
    SQ.line_id, 
    SQ.shift 
ORDER BY 
    SQ.shift, 
    SQ.line_id ASC 

而且,請注意,您的時間戳列的檢查可能會導致錯誤的結果如果MySQL是保持超過第二的精度。更好地使用hd2.timestamp >= '2016-01-04 00:00:00' AND hd2.timestamp < '2016-01-05 00:00:00'

+0

感謝您的答覆。我會採取你的迴應,看看我能做些什麼 – Imperialized

+0

我將如何去創建不在那裏的數據? (通過對錶引用的一些細微更改,查詢運行得很好) - 它產生我的確切結果(缺少沒有數據的那一行)。如果它返回一個空的結果,只要有line_id就可以。 - 給我幾分鐘,我會試着讓你成爲一個有數據的小提琴 – Imperialized

+0

無法編輯我上面的評論,但經過幾次嘗試,sqlfiddle的限制太小,我無法提供任何類型的「工作」數據進行測試。 – Imperialized