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

Flere Venstre Slut med sum

Problemet kan skyldes, at et kartesisk resultat af dine data og summeringer foregår. Bare for at præcisere, her er en simpel forespørgsel... Jeg ved, at jeg ikke har det hele, og jeg kan heller ikke slutte mig til kolonner perfekt, dette er kun for afklaring.

JEG VED OGSÅ, at jeg har forkortet kolonnerne og aliasserne for at forenkle læsning og forståelse af begrebet, hvad du sandsynligvis støder 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 slutningen, intet problem... for et givet år vil du få totalerne fra den anden tabel. Der er mange poster i tabel 2. Eks: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

Det er vi nok enige om på dette tidspunkt... Indsæt nu en anden tabel, der om året (eller hvad som helst), som også har flere rekorder om året...

Change_Orders
Yr     COAmt
2013   100
2013   120
2014   200
2014   220

Og du tilføjer dette som et sekundært venstre-join til din forespørgsel, sådan noget 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 da det er et kartesisk resultat... tager flere rækker pr. hver join resultaterne GANGE hver post, der findes i den anden tabel... noget i retning af

Yr    AmtChange  COChangeAmt
2013  120         440
2014  180         840

For at rette op på dette skal hver enkelt tabel, du får subtotaler fra, håndteres for sig selv og grupperes efter sit eget år, så delmængden kun returnerer én række pr. datakontekst. Noget lignende

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å underforespørgslerne returnerer hver kun 1 post for det respektive år, der aggregeres og forhindrer dermed duplikatet i sum()-beløb.



  1. Vælg ulåst række i Postgresql

  2. Kræver MySQL InnoDB altid et indeks for hver fremmednøglebegrænsning?

  3. Forår 2011 PostgreSQL-konferencer, USA/Canada

  4. Sådan tilføjes en primær nøgle til en eksisterende tabel i SQL Server (T-SQL-eksempler)