web-dev-qa-db-fra.com

Sélectionnez somme et jointure interne

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 ?

10
Klaus

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
17
Guffa

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
2
dotNET

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
0
VKS