繁体   English   中英

计算应付给每个用户的金额

[英]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中的每个用户都有多行,否则您不需要 AmountTakenSUM()

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

演示: http://sqlfiddle.com/#!9/3960b5/26

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM