SQL查询用JOINS或其他东西替换UNION ALL

时间:2012-04-14 21:20:53

标签: sql union

现在我有3张桌子

订单:

  

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 |件|产品|成分

谢谢,

1 个答案:

答案 0 :(得分: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在评论中提供的点。

相关问题