sql连接四个表并计算平均值

sql连接四个表并计算平均值,sql,join,average,calculated-columns,Sql,Join,Average,Calculated Columns,我如何得到一个连接这四个表的查询,并给出平均值 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

我如何得到一个连接这四个表的查询,并给出平均值

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

一定有什么天才以前做过这件事。我已经尝试过加入表格,但似乎无法得到一个平均值的列。非常感谢任何帮助或指导

这里不需要表3

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

好的,在我看来,你的问题是首先你需要一个所有可能的年/月/团队组合的列表,然后一旦你有了,你想把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

你应该把你到目前为止所拥有的东西贴出来。将AVG列添加到现有查询中要比编写整个内容(只是猜测)容易得多,但也许这可以作为一个起点?从表4中选择年份,团队,Average团队WinCount自然连接表2自然连接表1分组,团队,年份我的现有查询并没有得到太多,只是连接了所有表,但这给了我比我想要的更多的行:从表1中选择*T1交叉连接年份交叉连接月份内部连接表4 t4在T1.YearsId=Years.YearsId和t4.MonthsId=Months上。MonthsId@Akash:谢谢,但我不熟悉关键字Natural,我使用的是MSFT SQL Server,它不是一个可用的词。还有,我不需要把表3放在某个地方来计算每个月的平均数吗?我不确定等价物对您来说是什么,但只要将where子句中的正确列相等即可。之前没有注意到,如果月份不存在,则需要0。在这种情况下,我的想法将失败。这是我不需要表3的原因之一,但如果您希望在当月没有赢家的情况下在平均值中包含0,则需要。谢谢,编辑并添加IFNULL。因为不需要输出一个月的数据,所以如果某个月没有数据也没关系。AVG根据表4计算了可用数据的平均值!优雅,简单,工作起来很有魅力。谢谢顺便说一句,我不知道AVG功能这么智能,很高兴知道,谢谢!