【问题标题】:Calculate the amount payable to each user计算应付给每个用户的金额
【发布时间】:2021-03-11 18:13:29
【问题描述】:

我想计算支付给每个用户的金额。 这可能是否定的。简要说明:

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       |

【问题讨论】:

  • 你试过什么?你知道如何JOIN 表吗?这里有一个提示,你需要一个LEFT JOIN 来代表PAID
  • 我尝试了左连接。我认为我应该在取自和付费表中使用完全连接。但我没有成功。 @RocketHazmat
  • 你能显示你试过的查询吗?
  • SELECT users.Name, users.Surname, SUM(takenfrom.AmountTaken) - SUM(paid.AmountPaid) AS MustPay FROM users LEFT JOIN takefrom ON takefrom.UserId = users.UserId LEFT JOINpaid ONpaid .UserId = users.UserId GROUP BY users.UserId @RocketHazmat
  • 注意:phpMyAdmin 只是一个数据库客户端。它几乎与数据库本身或您正在运行的查询无关。在这里不相关。

标签: mysql sql


【解决方案1】:

您不需要在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

更新:如果 both paidtakenfrom 有多个行(对于 UserId),那么您将从 JOINs 获得重复的行。要解决此问题,您可以使用子查询而不是 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

【讨论】:

  • SUM(takenfrom.AmountTaken) - IFNULL(SUM(paid.AmountPaid), 0) .... 我改了。但它没有用。比如我把payed表增加500,我认为结果表不会是负数。简而言之,我希望在某些情况下结果是否定的。 @RocketHazmat
  • @ceza 这有什么“没用”的?给出什么结果?你期待什么结果?
  • @ceza 我添加了一个在线演示的链接。尝试更改演示以显示您所看到的内容。
  • foo = 100 - 0 ; f = 200 + 100 - (50 + 50); @RocketHazmat
  • 发生了。演示:sqlfiddle.com/#!9/13dda2/1/0 感谢一切。呜呜
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 2023-04-07
相关资源
最近更新 更多