[英]Calculate the amount payable to each user
我想计算应付给每个用户的金额。 这可能是否定的。 简要地:
MustPay = AmountTaken - AmountPaid
我无法编写 sql 查询。
SELECT users.Name, users.Surname,
SUM(takenfrom.AmountTaken) - SUM(paid.AmountPaid) AS MustPay
FROM users
LEFT JOIN takenfrom ON takenfrom.UserId = users.UserId
LEFT JOIN paid ON paid.UserId = users.UserId
GROUP BY users.UserId
表:
FIRST TABLE USERS
| UserId | Name | Surname |
| 1 | foo | boo |
| 2 | f | b |
SECOND TABLE TAKENFROM
| TakenFromId | UserId | AmountTaken|
| 1 | 1 | 100 |
| 2 | 2 | 200 |
THIRD TABLE PAID
| PaidId | UserId | AmountPaid|
| 1 | 2 | 50 |
| 2 | 2 | 50 |
RESULT TABLE
| Name | Surname| MustPay |
| foo | boo | 100 |
| f | b | 100 |
您不需要在TakenFrom
上进行LEFT JOIN
,因为每个用户都会向他们收取一定的费用,无论他们是否已支付是Paid
的用途。 您只需要在Paid
上进行LEFT JOIN
,因为用户可能已经付款,也可能没有。
由于不是每个用户都会有AmountPaid
,因此您需要使用IFNULL()
来检查它。 如果SUM()
给出NULL
NULL
此外,除非
takenfrom
中的每个用户都有多行,否则您不需要
AmountTaken
的
SUM()
。
SELECT users.Name, users.Surname,
SUM(takenfrom.AmountTaken) - IFNULL(SUM(paid.AmountPaid), 0) AS MustPay
FROM users
JOIN takenfrom ON takenfrom.UserId = users.UserId
LEFT JOIN paid ON paid.UserId = users.UserId
GROUP BY users.UserId
演示: http://sqlfiddle.com/#!9/e69b3b/1
更新:如果takenfrom
都有paid
行(对于UserId
),那么您将从JOIN
获得重复的行。 要解决此问题,您可以使用子查询而不是JOIN
:
SELECT Name, Surname,IFNULL((
SELECT SUM(AmountTaken) FROM takenfrom WHERE UserID = users.UserID
), 0) - IFNULL((
SELECT SUM(AmountPaid) FROM paid WHERE UserID = users.UserID
), 0) AS MustPay
FROM users
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.