Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Duplizieren mit SUM, LEFT JOIN und GROUP BY

Der erste Schritt, um zu sehen, was passiert, besteht darin, die SUMs zu entfernen und einfach den Transaktionsbetrag und den Anspruchsbetrag auszuwählen. Auf diese Weise können Sie sehen, welche Daten zurückgegeben werden. Sie werden sehen, dass die Verknüpfung auf A/2007 den Transaktionsbetrag zweimal enthält, da jede Zeile mit der Forderungstabelle verknüpft wird.

Eine Lösung besteht darin, wie Sie sagten, Unterabfragen zu verwenden, um die SUMs vor dem Beitritt separat durchzuführen.

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

Eine andere mögliche Lösung angesichts Ihrer Einschränkungen:

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

Dritte mögliche Lösung!! Dieser benötigt keine Unterabfragen! Siehe diese 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