sql >> Databasteknik >  >> RDS >> Mysql

Flera vänster Gå med summa

Problemet kan bero på ett kartesiskt resultat av dina data och summeringar som pågår. Bara för att förtydliga, här är en enkel fråga... Jag vet att jag inte har allt, och inte heller går det perfekta med kolumner, detta är bara för att förtydliga.

JAG VET OCKSÅ att jag har förkortat kolumnerna och aliasen för att förenkla läsning och förståelse av begreppet vad du förmodligen stöter på.

Select
      t1.yr,
      sum( t2.Amt ) as AmtChange
   FROM 
      budget AS t1
         LEFT JOIN Budget_Changes AS t2
            on t1.yr = t2.Yr

I slutet, inga problem... för ett givet år får du totalsummorna från den andra tabellen. Det finns många poster i tabell 2. Ex:Data

Budget
Yr
2013
2014

Budget_Changes
Yr    Amt
2013  10
2013  20
2013  30
2014  40
2014  50

Your results would be
Yr    AmtChange
2013  60
2014  90

Vi är förmodligen överens om det vid det här laget... Lägg nu in en annan tabell som per år (eller vad som helst), som också har flera rekord per år...

Change_Orders
Yr     COAmt
2013   100
2013   120
2014   200
2014   220

Och du lägger till detta som en sekundär vänsterkoppling till din fråga, ungefär som

Select
      t1.yr,
      sum( t2.Amt ) as AmtChange,
      sum( t3.COAmt ) as COAmtChange
   FROM 
      budget AS t1
         LEFT JOIN Budget_Changes AS t2
            on t1.yr = t2.Yr
         LEFT JOIN Change_Orders AS t3
            on t1.yr = t3.Yr


Your might expect the results to be
Yr    AmtChange  COChangeAmt
2013  60         220
2014  90         420

Men eftersom det är ett kartesiskt resultat... tar flera rader per varje koppling resultaten GÅNGER varje post som finns i den andra tabellen... ungefär som

Yr    AmtChange  COChangeAmt
2013  120         440
2014  180         840

För att fixa detta bör varje enskild tabell du får delsummor från hanteras för sig och grupperas efter sitt eget år så att delmängden endast returnerar en rad per datakontext. Något liknande

Select
      t1.yr,
      t2.AmtChange,
      t3.COAmtChange
   FROM 
      budget AS t1
         LEFT JOIN ( select BC.Yr, sum( BC.Amt ) as AmtChange
                        from Budget_Changes BC
                        group by BC.Yr ) t2
            on t1.yr = t2.Yr
         LEFT JOIN ( select CO.Yr, sum( CO.COAmt ) as COAmtChange
                        from Change_Orders CO
                        group by CO.Yr ) AS t3
            on t1.yr = t3.Yr

Så underfrågorna returnerar var och en endast en post för respektive år som aggregeras och förhindrar därmed dubbletter i sum()-belopp.



  1. Välja och konfigurera maskinvara för SQL Server 2016 Standard Edition

  2. Hur man lägger till en primärnyckel till en befintlig tabell i SQL Server (T-SQL-exempel)

  3. rails + MySQL på OSX:Biblioteket är inte laddat:libmysqlclient.18.dylib

  4. hibernate + mysql + ladda data i filen