sql >> Database >  >> RDS >> Mysql

Meerdere links samenvoegen met som

Het probleem kan zijn dat het gevolg is van een Cartesiaans resultaat van uw gegevens en sommaties. Ter verduidelijking, hier is een eenvoudige vraag... Ik weet dat ik niet alles heb, en ook niet perfect aansluit bij kolommen, dit is alleen ter verduidelijking.

IK WEET OOK dat ik de kolommen en aliassen heb afgekort voor een eenvoudigere lezing en begrip van het concept van wat u waarschijnlijk tegenkomt.

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

Aan het einde, geen probleem... voor een bepaald jaar krijgt u de totalen van de tweede tabel. Tabel 2 bevat veel records. Bijvoorbeeld:Gegevens

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

Daar zijn we het op dit moment waarschijnlijk over eens... Gooi er nu nog een tabel bij die ook per jaar (of wat dan ook) meerdere records per jaar heeft...

Change_Orders
Yr     COAmt
2013   100
2013   120
2014   200
2014   220

En je voegt dit toe als een secundaire left-join aan je zoekopdracht, zoiets als

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

Echter, aangezien het een Cartesiaans resultaat is... meerdere rijen per elke join krijgen de resultaten TIJDEN van elk item dat in de andere tabel bestaat... zoiets als

Yr    AmtChange  COChangeAmt
2013  120         440
2014  180         840

Om dit op te lossen, moet elke afzonderlijke tabel waarvan u subtotalen krijgt, op zichzelf worden afgehandeld en gegroepeerd op zijn eigen jaar, zodat de subset slechts één rij per gegevenscontext retourneert. Iets als

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

De subquery's zullen dus elk slechts 1 record voor het respectievelijke jaar retourneren dat wordt geaggregeerd en zo voorkomen dat het duplicaat in sum()-bedragen wordt gegenereerd.



  1. MySQL:NULL naar 0 . typecasten

  2. Hoe u een kolomverklaring voor alle tabellen in een database in SQL Server kunt genereren - SQL Server / T-SQL-zelfstudie, deel 49

  3. mysqli laatste invoeg-ID

  4. Hoe je het beste iemands 'rang' kunt krijgen uit een scoretabel met php en mysql zonder looping