Mysql
 sql >> база данни >  >> RDS >> Mysql

Множество ляво присъединяване със сума

Проблемът може да се дължи на декартов резултат от вашите данни и сумирания. Само за изясняване, ето една проста заявка... Знам, че нямам всичко, нито съединявам колони перфектно, това е само за пояснение.

СЪЩО ЗНАМ, че съкратих колоните и псевдоними за опростено четене и разбиране на концепцията за това, което вероятно срещате.

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

В крайна сметка няма проблем... за дадена година ще получите общите суми от втората таблица. В таблица 2 има много записи. Например:Данни

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

Вероятно сме съгласни с това в този момент... Сега, добавете друга таблица, която на година (или каквото и да е), която също има множество записи годишно...

Change_Orders
Yr     COAmt
2013   100
2013   120
2014   200
2014   220

И вие добавяте това като вторично ляво присъединяване към вашата заявка, нещо като

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

Въпреки това, тъй като това е декартов резултат... множество редове за всяко присъединяване приема резултатите ПЪТИ всеки запис, който съществува в другата таблица... нещо като

Yr    AmtChange  COChangeAmt
2013  120         440
2014  180         840

За да коригирате това, всяка отделна таблица, от която получавате междинни суми, трябва да се обработва самостоятелно и да се групира по собствената си година, така че подмножеството да връща само един ред на контекст от данни. Нещо като

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

Така че всяка от подзаявките ще върне само 1 запис за съответната година, която се обобщава и по този начин ще предотврати дублирането на суми sum().



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да оптимизирам функцията ORDER BY RAND() на MySQL?

  2. Как да получите стойности на една колона с MySQLi?

  3. Използване на ключова дума срещу клауза ON - MYSQL

  4. Примери за DAYOFWEEK() – MySQL

  5. Просто отстраняване на неизправности при влизане в PHP SQL