2011-09-20 2 views
-1

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

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

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

+0

Вы должны отправить то, что у вас есть до сих пор. Его проще просто добавить столбец AVG в существующий запрос, чем написать все это. –

+0

Просто догадайтесь, но, возможно, это будет в качестве отправной точки? выберите год, команда, средний (teamwincount) из таблицы4 natural join table 2 natural join table 1 группа по команде, год – Akash

+0

Существующие запросы, которые у меня на самом деле не были очень полезными, просто присоединились ко всем таблицам, но это дает мне еще много строк чем я хочу: выберите \t * FROM table1 T1 перекрестное соединение Years перекрестное соединение Месяцы внутреннее соединение table4 t4 ON t1.YearsId = Years.YearsId И t4.MonthsId = Months.MonthsId – russds

ответ

1

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 
+1

, но если вы хотите, чтобы 0 было включено в среднем, когда в этом месяце нет побед. – HLGEM

+1

спасибо, отредактирован (и добавлен 'IFNULL'). потому что нет необходимости выводить месяц, не имеет значения, нет ли данных за месяц. 'AVG' рассчитал среднее значение для доступных данных на основе' Table4' – rabudde

+0

Awesome! элегантный, простой и работает как шарм. Благодаря! PS. не знал, что функция AVG была настолько умной, что очень приятно знать, спасибо! – russds

1

КИ, как я понимаю, ваша проблема сначала вам нужен список всех возможных комбинаций года/месяца/команды, то, как только у вас есть, что вы хотите, чтобы преобразовать любой нуль значения для 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 
Смежные вопросы