Prenez les données suivantes:

db.users

id      name
1       David
2       James
3       Mary

db.payments
amount  user_id     paid
5       1           0
55      1           1
94      1           1
5       2           0
55      2           1
94      2           1
5       2           0
55      2           1
94      2           1

Je voudrais GAUCHE JOIN le tableau des paiements à la table des utilisateurs et SOMMEZ () le montant où payé = 0:

SELECT users.*, SUM(payments.amount)
FROM users
LEFT JOIN payments
ON users.id = payments.user_id
WHERE payments.paid = 0
GROUP BY users.id
ORDER BY users.id DESC

Le problème se pose en ce que «mary» (utilisateur 3) n'est pas renvoyée car elle n'a aucun enregistrement dans la table des paiements. Cela revient à la clause WHERE vérifiant payé = 0.

Je voudrais qu'il renvoie 0 comme somme si aucun enregistrement.

Des idées pour faire ça?

1
David 21 avril 2017 à 12:33

3 réponses

Meilleure réponse

Déplacez le prédicat payments.paid = 0 de la clause WHERE vers ON, comme:

SELECT users.*, SUM(payments.amount)
FROM users
LEFT JOIN payments
ON users.id = payments.user_id AND payments.paid = 0
GROUP BY users.id
ORDER BY users.id DESC

Si vous placez le prédicat dans la clause WHERE, LEFT JOIN devient un INNER JOIN.

3
Giorgos Betsos 21 avril 2017 à 09:35

Vous devez mettre-> sum (isnull (payment.amount, 0)) comme nombre de paiements dans votre requête

SELECT users.*, SUM(isnull(payments.amount,0))
FROM users
LEFT JOIN payments
ON users.id = payments.user_id
WHERE payments.paid = 0
GROUP BY users.id
ORDER BY users.id DESC
1
Rajeev Kushwaha 21 avril 2017 à 09:42

Essaye ça:-

SELECT users.Id, users.name, SUM(case when paid=0 then amount else 0 end) as 
req_amt
FROM users
LEFT JOIN payments
ON users.id = payments.user_id
GROUP BY users.id,users.name
ORDER BY users.id DESC

Merci:-)

1
India.Rocket 21 avril 2017 à 09:42