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

Duplikering, der involverer SUM, LEFT JOIN og GROUP BY

Så det første skridt til at se, hvad der sker, er at fjerne SUMMER og bare vælge transaktionsbeløbet og kravbeløbet. På den måde kan du se, hvilke data der returneres. Du vil se, at sammenføjningen på A/2007 vil have transaktionsbeløbet to gange, da det føjer hver række til kravtabellen.

En løsning er at bruge underforespørgsler, som du sagde, til at lave SUM'erne separat før tilslutning.

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 anden mulig løsning givet dine begrænsninger:

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 mulig løsning!! Denne kræver ingen underforespørgsler! Se denne 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


  1. Sådan konverteres en normal forespørgsel til en krydstabuleringsforespørgsel i Access

  2. Problemer med at tilføje rækker med JDBC og MySQL?

  3. CodeIgniter:Sådan udføres en Select (Distinct Fieldname) MySQL-forespørgsel

  4. Opdaterer kolonne, så den indeholder rækkepositionen