sql >> Databáze >  >> RDS >> Mysql

Duplikace zahrnující SUM, LEFT JOIN a GROUP BY

Takže prvním krokem, abyste viděli, co se děje, je odstranit SUM a pouze vybrat částku transakce a částku nároku. Tímto způsobem můžete vidět, jaká data se vracejí. Uvidíte, že spojení na A/2007 bude mít částku transakce dvakrát, protože připojuje každý řádek k tabulce nároků.

Jedním z řešení je použití dílčích dotazů, jak jste řekl, k provádění SUMů samostatně před připojením.

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

Další možné řešení vzhledem k vašim omezením:

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

Třetí možné řešení!! Tento nevyžaduje žádné poddotazy! Podívejte se na tento 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. 12c Automatické vyplnění sloupce se sekvenční hodnotou

  2. jak používat `charset` a `encoding` v `create_engine` SQLAlchemy (k vytvoření datového rámce pandy)?

  3. PHP - načítání připraveného stmt do třídy:Třída Fatal Error nenalezena

  4. Export tabulky z databáze do souboru csv