J'ai ce tableau suivant:
payee | payer | amount -----------|-----------|---------- USER3 | USER1 | 150.00 USER3 | USER2 | 50.00 USER1 | USER3 | 300.00 USER2 | USER3 | 300.00 USER3 | USER6 | 100.00
Je veux combiner deux loggings où le bénéficiaire est le payeur du deuxième logging et le payeur est le bénéficiaire du deuxième logging et recalculer le montant. Donc, mon résultat requirejs est:
payee | payer | amount ---------- | ------------| --------- USER1 | USER3 | 150.00 USER2 | USER3 | 250.00 USER3 | USER6 | 100.00
La plupart des bases de données ont les fonctions least()
et greatest()
, donc l'une est:
select least(payee, payer) as payee, greatest(payee, payer) as payer, sum(case when payee = least(payee, payer) then amount else - amount end) as amount from t group by least(payee, payer), greatest(payee, payer);
(Dans ceux qui ne le font pas, vous pouvez utiliser une expression de case
.)
Si vous voulez toujours des nombres positifs, vous pouvez utiliser une sous-requête:
select (case when amount < 0 then payer else payee end) as payee, (case when amount < 0 then payee else payer end) as payer, abs(amount) from (select least(payee, payer) as payee, greatest(payee, payer) as payer, sum(case when payee = least(payee, payer) then amount else - amount end) as amount from t group by least(payee, payer), greatest(payee, payer) ) t;