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功能这么智能,很高兴知道,谢谢!