SQL объединить четыре таблицы и рассчитать среднее - PullRequest
0 голосов
/ 20 сентября 2011

Как бы я получить запрос, который объединяет эти четыре таблицы, а также дает мне среднее?

Table1:
TeamId |   TeamName
  1    |      TA
  2    |      TB
  3    |      TC

Table2:
YearsId  | Years
    1    | 2009-2010
    2    | 2010-2011
    3    | 2011-2012

Table3:
MonthsId | Month
    1    |  July
    2    |  Aug
    3    |  Sept

Table4:
TeamId  | MonthsId  | YearsId  | TeamWinCount
    1   |     1     |    2     |        44
    1   |     1     |    3     |        11
    1   |     2     |    2     |        0
    1   |     12    |    3     |        13
    2   |     1     |    2     |        33

Я бы хотел получить результаты, которые выглядят так:

   Year    |  Team   | Avg (avg win count jun+aug+sept+.../12)
 2009-2010 |   TA    |   23.3
 2009-2010 |   TB    |   18.23    
 2009-2010 |   TC    |   35.23    
 2010-2011 |   TA    |   18.23    
 2010-2011 |   TB    |   18.23    
 2010-2011 |   TC    |   18.23    

Если в течение месяца нет записи, ее следует считать 0

Должен быть какой-то гений, который делал это раньше. Я поиграл с присоединением к столам, но, похоже, не могу получить среднюю колонку. Любая помощь или направление очень ценится!

Ответы [ 2 ]

1 голос
/ 20 сентября 2011

ОК, как я понимаю, ваша проблема - сначала вам нужен список всех возможных комбинаций год / месяц / команда, затем, как только вы захотите, вы хотите преобразовать любые нулевые значения для wincount в 0, затем вы хотите сделать среднее.

Я бы попробовал несколько вариантов:

select Years, TeamName, avg(wincount)
from 
(Select  Years, Month, TeamName, case when Wincount is null then 0  else  Wincount
from table1 t1
cross join table2 t2
cross join tabl3 t3
left join table4 t4 
on t1.teamid = t4.teamid and t2.yearsId = t4.yearsId
    and t3.MonthsId = t4.monthsId) a
group by Years, TeamName
1 голос
/ 20 сентября 2011

Table3 здесь не нужно

SELECT Table2.Years,Table1.TeamName,IFNULL(AVG(TeamWinCount), 0) AS TeamWinCount
FROM Table2
CROSS JOIN Table1
LEFT JOIN Table4 ON Table1.TeamId=Table4.TeamId AND Table2.YearsId=Table4.YearsId
GROUP BY Table2.Years,Table1.TeamName
...