J'ai deux tables
Bills
: id amount reference
Transactions
: id reference amount
La requête SQL suivante
SELECT
*,
(SELECT SUM(amount)
FROM transactions
WHERE transactions.reference = bils.reference) AS paid
FROM bills
GROUP BY id HAVING paid<amount
était destiné à certaines lignes de la table Bills
, en ajoutant une colonne paid
avec la somme du montant des transactions connexes.
Toutefois, cela ne fonctionne que s’il ya au moins une transaction pour chaque facture. Sinon, aucune ligne pour une facture sans transaction n'est renvoyée.
C'est probablement parce que j'aurais dû faire une jointure interne!
Alors j'essaye ce qui suit:
SELECT
*,
(SELECT SUM(transactions.amount)
FROM transactions
INNER JOIN bills ON transactions.reference = bills.reference) AS paid
FROM bills
GROUP BY id
HAVING paid < amount
Cependant, cela retourne la même valeur de payé pour toutes les lignes! Qu'est-ce que je fais mal ?
Utilisez une jointure gauche au lieu d'une sous-requête:
select b.id, b.amount, b.paid, sum(t.amount) as transactionamount
from bills b
left join transactions t on t.reference = b.reference
group by b.id, b.amount, b.paid
having b.paid < b.amount
Modifier:
Pour comparer la somme des transactions au montant, gérez la valeur NULL que vous obtenez en l’absence de transaction:
having isnull(sum(t.amount), 0) < b.amount
Vous avez besoin d'un RIGHT JOIN
pour inclure toutes les lignes de facture.
EDIT La requête finale sera donc
SELECT
*,
(SELECT SUM(transactions.amount)
FROM transactions
WHERE transactions.reference = bills.reference) AS paid
FROM bills
WHERE paid < amount
Je sais que ce fil est vieux, mais je suis venu ici aujourd'hui parce que je rencontre le même problème.
Voir un autre article avec la même question: Sum sur une jointure gauche SQL
Comme le dit la réponse, utilisez GROUP BY dans le tableau de gauche. De cette façon, vous extrayez tous les enregistrements de la table de gauche et la somme des lignes correspondantes de la table de droite.
Essayez d'utiliser ceci:
SELECT
*,
SUM(transactions.sum)
FROM
bills
RIGHT JOIN
transactions
ON
bills.reference = transactions.reference
WHERE
transactions.sum > 0
GROUP BY
bills.id