2012-04-14 37 views
2

現在我有3個表SQL查詢替換UNION ALL與加入或東西

訂單:

ID |日期|機器|規劃

GoodPieces:

ID |日期|機器|件| |產品

BadPieces:

ID |日期|機器|件| |產品|組件

查詢的輸出是

日期|機器|計劃| GoodPieces | BadPieces

的實際查詢是類似的東西:

SELECT 
    data.Date AS Date, 
    data.Machine AS Machine, 
    SUM(CASE WHEN data.type = 'Planning' THEN data.value END) AS Planning, 
    SUM(CASE WHEN data.type = 'GoodPieces' THEN data.value END) AS GoodPieces, 
    SUM(CASE WHEN data.type = 'BadPieces' THEN data.value END) AS BadPieces 
FROM 
     (SELECT 
      'Planning' AS Type, 
      Date AS Date, 
      Machine AS Machine, 
      Planning AS Value 
     FROM Orders 
     UNION ALL 
     SELECT 
      'GoodPieces', 
      Date, 
      Machine, 
      Pieces AS Value 
     FROM GoodPieces 
     UNION ALL 
     SELECT 
      'BadPieces' 
      Date, 
      Machine, 
      Pieces AS Value 
     FROM BadPieces) AS data 
GROUP BY 
    Date, 
    Machine 

我的問題,如果是有沒有辦法讓這個3個表

訂單相同的輸出:

ID |日期|機|規劃

GoodPieces:

的OrderID |件| |產品

BadPieces:

的OrderID |件| |產品|組件

感謝,

回答

5

當然,只是在表中LEFT JOIN,總結相應的列:

SELECT 
    O.Date, 
    O.Machine, 
    SUM(COALESCE(O.Planning, 0)) AS Planning, 
    SUM(COALESCE(G.Pieces, 0)) AS GoodPieces, 
    SUM(COALESCE(B.Pieces, 0)) AS BadPieces 
FROM 
    Orders O 
LEFT JOIN 
    (SELECT G.OrderID, 
    SUM(COALESCE(G.Pieces, 0)) AS GoodPieces 
    FROM GoodPieces G 
    GROUP BY G.OrderID) G ON G.OrderID = O.ID 
LEFT JOIN 
    (SELECT B.OrderID, 
    SUM(COALESCE(B.Pieces, 0)) AS BadPieces 
    FROM BadPieces B 
    GROUP BY B.OrderID) B ON B.OrderID = O.ID 
GROUP BY 
    O.Date, 
    O.Machine; 

演示:http://www.sqlfiddle.com/#!3/09a73/17

編輯:更新到處理點由下式給出@MikaelEriksson的評論。

+1

如果'OrderID'在'BadPieces'中是唯一的,這將起作用。嘗試添加(8,1)到'BadPieces'。 「BothTest」的計算結果是錯誤的。 – 2012-04-14 21:51:12

+1

@MikaelEriksson:極好的一點!我已通過在子查詢中通過'OrderID'將'GoodPieces'和'BadPieces'中的數據彙總在一起進行了更新。現在的數據甚至與您的案例相匹配,在這裏測試原始查詢:http://www.sqlfiddle.com/#!3/1698e/3 – mellamokb 2012-04-14 22:59:41

+1

SQL FIDDLE我不知道那個頁面..謝謝你這麼匹配..並感謝您的解決方案 – leinho 2012-04-16 23:37:51