因此,我有一个用于跟踪小组付款的简单应用。数据库结构如下:



本质上,当您添加付款时,会将其插入到payments表中,并且payers_payments联接表中包含有关每个payer已付款额以及是否应将其包括在付款中的枢轴数据。我的应用程序检索此数据并构建一个语句,显示每个付款人已支付的金额,其应得份额和所欠金额。通过付款和总和显示每个付款人的总和。

示例数据:

付款人付款



付款方式



这是带有2个付款的示例语句(数据与上面的示例数据不匹配)。在第二笔付款中,汤姆不包括在付款(pays = false)中,因此他的公平份额是0,而蒂姆的公平份额是这两次付款的总和除以该付款的pays=true数。



有没有一种方法可以查询每个付款人的总数,而无需单独获取每笔付款并循环遍历以获得总额?我可以轻松获得每个付款人的总付款额:

SELECT payers_payments.payer_id,
       Sum(payers_payments.amount) AS SumOfamount
  FROM payers_payments
GROUP BY
       payers_payments.payer_id;


但是如何获得公平份额?基本上,我需要将每次付款的金额相加,然后除以拥有pays=true以获得付款公平份额的付款人数量,并将其添加到付款人具有pay=true的付款人公平份额总额中。 1个查询可以吗?

最佳答案

SELECT payers_payments.payer_id,
       Sum(payers_payments.amount) AS SumOfamount,
       Sum(if(payers_payments.pays=1,1,0)) AS countOfPays
  FROM payers_payments
GROUP BY
       payers_payments.payer_id;


那是MySQL版本。

sum(if())可以替换为

SUM(CASE(payers_payments.pays) WHEN 1 THEN 1 ELSE 0 END AS countOfPays

10-01 15:56
查看更多