Mysql
 sql >> Database >  >> RDS >> Mysql

Duplicazione che coinvolge SUM, LEFT JOIN e GROUP BY

Quindi il primo passo per vedere cosa sta succedendo è rimuovere i SUM e selezionare semplicemente l'importo della transazione e l'importo del reclamo. In questo modo puoi vedere quali dati vengono restituiti. Vedrai che il join su A/2007 avrà l'importo della transazione due volte, poiché unisce ogni riga alla tabella dei reclami.

Una soluzione consiste nell'utilizzare le sottoquery, come hai detto, per eseguire i SUM separatamente prima dell'adesione.

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

Un'altra possibile soluzione date le tue restrizioni:

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

Terza soluzione possibile!! Questo non richiede subquery! Vedi questo 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