2012-04-14 191 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