2013-08-18 76 views
0

我有兩個表具有以下字段:每個訂單
...
如何從一個表中選擇與另一個表中的(總和)差異?

orders.orderID 
orders.orderValue 

payments.orderID 
payments.payVal 

payments.payVal會有增量支付(多到一)。
我需要它,所以請選擇orders的所有訂單,其中有付款餘額(orders.orderValue - ((sum)payments.payVal) > 0)

我現在唯一能做的事情是使用orderID的(foreach),但由於某些特殊原因,我無法做到這一點。由於某些原因,我也無法在表格中添加一列來保存值。

我需要什麼,是在一個單獨的SQL查詢一些類似於這樣的想法執行整個的選擇:SELECT * FROM orders WHERE <... each(orderValue - (sum(payVal))) > 0 ...>

回答

1
SELECT *, SUM(p.payVal) AS TotalPayed 
FROM orders o 
LEFT JOIN payments p ON o.orderID = p.orderID 
GROUP BY o.orderID 
HAVING SUM(p.payVal) < o.orderValue 

這應該爲你提供必要的字段,但我會建議你選擇特定的與此查詢字段。

LEFT JOIN確保您獲得每一筆訂單,即使尚未付款。

SQL Fiddle

+0

如果你不需要'TotalPayed'場,你可以簡單地使用 'SELECT * FROM [...]'。 –

-1

看來我們來到了同一個解決方案,

http://sqlfiddle.com/#!2/9a657/18

SELECT * FROM `orders` 
LEFT JOIN `payments` AS p ON `orders`.`orderID` = p.`orderID` 
GROUP BY `orders`.`orderID` 
HAVING SUM(p.`payVal`) <= 0 
+0

我喜歡這兩種解決方案,你和@Marty McVry的......基本上都是一樣的。但是,出於一些整合的原因,我會使用你的語法。 (我已經自動化了我的sql查詢,自動化過程更符合你的語法)。從馬蒂的我學到了一些有趣的...謝謝。 – derei

+0

實際上,這個查詢只會得到已經支付的總金額小於或等於0的地方......這不完全是這裏所需要的......(所以,它們不是一樣的......)嘗試執行我的查詢這個SQL小提琴中的示例數據。 –

相關問題