sql >> Databasteknik >  >> RDS >> Mysql

Duplicering som involverar SUM, LEFT JOIN och GROUP BY

Så det första steget för att se vad som händer är att ta bort SUMMA och bara välja transaktionsbelopp och anspråksbelopp. På så sätt kan du se vilken data som returneras. Du kommer att se att anslutningen på A/2007 kommer att ha transaktionsbeloppet två gånger, eftersom det ansluter varje rad till skadetabellen.

En lösning är att använda subquerys, som du sa, för att göra SUM:arna separat innan du går med.

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

En annan möjlig lösning med tanke på dina begränsningar:

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

Tredje möjliga lösningen!! Den här kräver inga underfrågor! Se denna SQL-fiol

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


  1. Hur bygger man index i MySQL för att påskynda denna fråga?

  2. Skapa dynamiskt kolumner från raddata med Välj i Bigquery

  3. PHP/MySQLi:SET lc_time_names och DATE_FORMAT() i en mysqli-fråga?

  4. Återställ markörpositionen i PDO