Reputation: 59
Now I have 3 tables
Orders:
ID | Date | Machine | Planning
GoodPieces:
ID | Date | Machine | Pieces | Product
BadPieces:
ID | Date | Machine | Pieces | Product | Component
The output of the query is
Date | Machine | Planning | GoodPieces | BadPieces
The actual query is something like that:
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
My question is if is there a way to get the same output with this 3 tables
Orders:
ID | Date | Machine| Planning
GoodPieces:
OrderID | Pieces | Product
BadPieces:
OrderID | Pieces | Product | Component
Thanks,
Upvotes: 3
Views: 22063
Reputation: 56769
Sure, just LEFT JOIN
in the tables and sum the appropriate columns:
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;
Demo: http://www.sqlfiddle.com/#!3/09a73/17
Edit: Updated to handle point given by @MikaelEriksson
in comments.
Upvotes: 6