【问题标题】:sql join four tables and calculate averagesql连接四个表并计算平均值
【发布时间】:2011-09-20 18:39:38
【问题描述】:

如何获得连接这四个表的查询,并给出平均值?

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

以前一定有什么天才做过。我玩过加入表格,但似乎无法获得平均值的列。非常感谢任何帮助或指导!

【问题讨论】:

  • 你应该发布你目前所拥有的。将 AVG 列添加到现有查询比编写整个内容更容易
  • 只是一个猜测,但也许这可以作为一个起点? select year,team,average(teamwincount) from table4 natural join table 2 natural join table 1 group by team,year
  • 我现有的查询并没有真正让我得到太多,只是加入所有表,但这给了我比我想要的更多的行:select * FROM table1 T1 cross join Years cross join Months inner join table4 t4 ON t1.YearsId = Years.YearsId AND t4.MonthsId = Months.MonthsId
  • @Akash:谢谢,但我不熟悉关键字“Natural”,我使用的是 MSFT SQL Server,它不是一个可用的词。另外,我不需要在某个地方使用 table3 来计算每个月的计数以获得平均值吗?
  • en.wikipedia.org/wiki/Join_%28SQL%29#Natural_join 我不确定你的等价物是什么,但只是将 where 子句中的正确列等同起来。之前没有注意到如果月份不存在,你想要一个 0。在那种情况下我的想法会失败。(这是我不需要 table3 的原因之一)

标签: sql join average calculated-columns


【解决方案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

【讨论】:

  • 但如果您希望在当月没有获胜的情况下将 0 包含在平均值中。
  • 感谢,已编辑(并添加了IFNULL)。因为一个月不需要输出,所以一个月没有数据也没关系。 AVG 根据 Table4 计算可用数据的平均值
  • 太棒了!优雅,简单,像魅力一样工作。谢谢! PS。没想到AVG功能这么智能,很高兴知道,谢谢!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-04-29
    • 2011-10-23
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    相关资源
    最近更新 更多