Mysql
 sql >> Base de données >  >> RDS >> Mysql

Duplication impliquant SUM, LEFT JOIN et GROUP BY

Donc, la première étape pour voir ce qui se passe est de supprimer les SUM et de sélectionner simplement le montant de la transaction et le montant de la réclamation. De cette façon, vous pouvez voir quelles données sont renvoyées. Vous verrez que la jointure sur A/2007 aura le montant de la transaction deux fois, puisqu'elle joint chaque ligne à la table des réclamations.

Une solution consiste à utiliser des sous-requêtes, comme vous l'avez dit, pour faire les SUM séparément avant de se joindre.

SELECT 
   Transactions.Customer,
   Transactions.Year,
   SumTransaction,
   SumClaim
FROM (
      select Customer, Year, sum(Transaction Amount) SumTransaction 
      from Transactions
      group by Customer, Year
   ) Transactions
   LEFT JOIN (
      select Customer, Year, sum(Claim Amount) sumClaim 
      from Claims
      group by Customer, Year
   ) Claims
   ON Claims.Customer = Transactions.Customer
      AND Transactions.Year = Claims.Year

Autre solution possible compte tenu de vos restrictions :

SELECT 
   Transactions.Customer,
   Transactions.Year,
   SUM(Transaction Amount),
   (SELECT SUM(Claim Amount) from Claims where Claims.Customer = Transactions.Customer and Claims.Year = Transactions.Year)
FROM 
   Transactions
GROUP BY
   Customer, Year

Troisième solution possible !! Celui-ci ne nécessite aucune sous-requête ! Voir ce SQL Fiddle

select
    t.Customer,
    t.Year,
    sum(distinct t.Amount),
    sum(c.Amount)
from
    Transactions t
    left join Claims c
        on  t.Customer = c.Customer
            and t.Year = c.year
group by
    t.Customer,
    t.Year