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

Vícenásobné levé spojení se součtem

Problémem může být skutečnost způsobená kartézským výsledkem vašich dat a probíhajících sumací. Jen pro upřesnění, zde je jednoduchý dotaz... Vím, že nemám vše, ani spojování sloupců dokonalé, to je jen pro upřesnění.

TAKÉ VÍM, že jsem zkrátil sloupce a aliasy pro zjednodušené čtení a pochopení konceptu toho, s čím se pravděpodobně setkáváte.

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

Na konci žádný problém... za daný rok získáte součty z druhé tabulky. V tabulce 2 je mnoho záznamů. Příklad: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

Na tom se v tuto chvíli pravděpodobně shodneme... Nyní přihoďte další tabulku, která za rok (nebo cokoli jiného) má také více záznamů za rok...

Change_Orders
Yr     COAmt
2013   100
2013   120
2014   200
2014   220

A přidáte to jako sekundární levé spojení k vašemu dotazu, něco jako

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

Protože se však jedná o kartézský výsledek... více řádků na každé spojení bere výsledky KRÁTKY každý záznam, který existuje v druhé tabulce... něco jako

Yr    AmtChange  COChangeAmt
2013  120         440
2014  180         840

Chcete-li to vyřešit, každá jednotlivá tabulka, ze které získáváte mezisoučty, by měla být zpracována samostatně a seskupena podle vlastního roku, aby podmnožina vrátila pouze jeden řádek na kontext dat. Něco jako

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

Každý dílčí dotaz tedy vrátí pouze 1 záznam pro příslušný rok, který se agreguje, a zabrání tak duplicitě v sum() množství.



  1. Vyberte nejlepší odlišné výsledky seřazené podle frekvence

  2. Jak mohu nastavit formát automatického přírůstku na 0001 v MySQL?

  3. Všechny užitečné 11g dynamické zobrazení výkonu

  4. Získejte počet dní mezi dvěma daty v Oracle, včetně dat