Inizierei scrivendo una query che funzioni su cosa sia una singola quota di un pagamento. Cioè, per payment_id
, la somma di tutti gli importi, divisa per il numero di persone che deve pagare. Il risultato può quindi essere unito ai dati originali.
SELECT
payers_payments.payer_id,
SUM(payers_payments.amount ) AS total_paid,
SUM(payers_payments.pays * payments.single_share) AS fair_share
FROM
payers_payments
INNER JOIN
(
SELECT
payment_id,
SUM(amount) / SUM(pays) AS single_share
FROM
payers_payments
GROUP BY
payment_id
)
AS payments
ON payers_payments.payment_id = payments.payment_id
GROUP BY
payers_payments.payer_id
Sarà utile avere indici su entrambi (payment_id)
e (payer_id)
.
Sarà utile avere l'amount
campo in un tipo di dati DECIMAL, anche se devi considerare cosa vuoi fare con l'arrotondamento. (Un pagamento totale di 10,00 deve essere diviso in tre modi, 3,33 ciascuno e poi cosa vuoi che accada allo 0,01 di riserva?)