2013-08-18 2 views
0

J'ai deux tables avec des champs suivants:
...
Comment sélectionner parmi une table où différence avec (somme) d'une autre table?

orders.orderID 
orders.orderValue 

et

payments.orderID 
payments.payVal 

En payments.payVal il y aura des paiements supplémentaires pour chaque commande (many-to-one).
Ce dont j'ai besoin, donc sélectionnez toutes les commandes de orders où il reste de paiement (orders.orderValue - ((sum)payments.payVal) > 0). La seule chose que je peux faire maintenant est un (foreach) en utilisant le orderID, mais je ne peux pas le faire pour certaines raisons particulières. Je ne peux pas non plus ajouter une colonne à l'intérieur d'une table pour conserver la valeur pour certaines raisons.

Ce que je dois, est d'effectuer la sélection entière en une seule chose requête SQL qui ressemble à cette idée: SELECT * FROM orders WHERE <... each(orderValue - (sum(payVal))) > 0 ...>

Répondre

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 

Cela devrait vous fournir les champs nécessaires, bien que je vous conseille de sélectionner spécifique champs avec cette requête.

Le LEFT JOIN garantit que vous obtenez chaque commande, même si aucun paiement n'a encore été effectué.

SQL Fiddle

+0

Si vous n'avez pas besoin le champ 'TotalPayed', vous pouvez simplement utiliser ' SELECT * FROM [...] '. –

-1

On dirait que nous sommes arrivés à la même solution,

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

J'aime les deux solutions, la vôtre et celle de @Marty McVry ... fondamentalement, sont les mêmes. Mais, pour des raisons d'intégration, je vais utiliser votre syntaxe. (J'ai automatisé mes requêtes sql et le processus d'automatisation correspond mieux à votre syntaxe). De Marty j'ai appris quelque chose d'intéressant ... merci. – derei

+0

En fait, cette requête obtient seulement où le montant total déjà payé est inférieur ou égal à 0 ... Ce n'est pas exactement ce qui est nécessaire ici ... (Donc, ils ne sont pas les mêmes ...) Essayez d'exécuter ma requête sur le exemples de données dans ce violon SQL. –

Questions connexes