Ваш план того, что вы хотите сделать, хорош, но это не то, что вы реализовали.
- Я хочу суммировать все
product_quantity
из table1
, где product_id = '$this'
, и суммировать все order_quantity
в table2
, где product_hashid = '$this'
и сделать (a - b) для отображения окончательного результата.
Создайте его по одному шагу за раз.
SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID = '$this';
SELECT SUM(order_quantity) FROM Table2 WHERE Product_HashID = '$this';
SELECT (SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID = '$this') -
(SELECT SUM(order_quantity) FROM Table2 WHERE Product_HashID = '$this')
FROM Dual;
Вы можете заметить, что выравнивание кода подчеркивает несогласованное именование столбцов для столбцов идентификатора продукта.
В более общем случае:
SELECT Product_ID, SUM(product_quantity) AS Product_Quantity
FROM Table1
GROUP BY Product_ID;
SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity
FROM Table2
GROUP BY Product_HashID;
SELECT p.Product_ID, p.Product_Quantity - o.Order_Quantity AS SurplusOnHand
FROM (SELECT Product_ID, SUM(product_quantity) AS Product_Quantity
FROM Table1
GROUP BY Product_ID) AS P
JOIN (SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity
FROM Table2
GROUP BY Product_HashID) AS O
ON O.Product_ID = P.Product_ID;
Иногда вам нужно использовать LEFT OUTER JOIN; в основном, нет. Напишите свой SQL, предполагая, что вы этого не сделаете, пока не будете уверены, что делаете.
Принимая во внимание количество элементов данных (количество строк), вам может потребоваться сделать LOJ здесь. Вам необходимо изготовить ноль для количества заказа тех продуктов, перечисленных в Таблице 1, которые не перечислены в Таблице 2.
SELECT (SELECT SUM(product_quantity) FROM Table1 WHERE Product_ID = '$this') -
NVL(SELECT SUM(order_quantity) FROM Table2 WHERE Product_HashID = '$this'), 0)
FROM Dual;
SELECT p.Product_ID, p.Product_Quantity - NVL(o.Order_Quantity, 0) AS SurplusOnHand
FROM (SELECT Product_ID, SUM(product_quantity) AS Product_Quantity
FROM Table1
GROUP BY Product_ID) AS P
LEFT OUTER JOIN
(SELECT Product_HashID AS Product_ID, SUM(order_quantity) AS Order_Quantity
FROM Table2
GROUP BY Product_HashID) AS O
ON O.Product_ID = P.Product_ID;