【问题标题】:SQL: Oracle avg over groupSQL:Oracle 平均分组
【发布时间】:2016-11-29 16:57:36
【问题描述】:

我想通过示例展示我的问题。 所以,我有学生,他们在不同的学校学习,我想按学校计算平均数,然后计算总平均数。

例子:

那么,我怎样才能得到这样的结果呢?

提前致谢!

还有一个选项 - 我在一个查询中执行此操作确实更舒服。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • @tamasRev 我尝试使用 avg("schoolAvg")over(),不同的分区情况,但这没有帮助。
  • @tamasRev 我有两种错误:如果我使用“avg(distinct ..)
  • 两个问题...您希望 OUTPUT 为每个学生显示一行,还是每个学校仅显示一行?而且...您似乎想通过将学校平均数相加并除以学校数量来计算“全球”平均数-这是您想要/需要的吗?你确定吗?这是一种完全没有意义的计算“平均值”的方法; “全球”平均值应该是学校平均值的加权平均值,由每所学校的学生人数加权(这与从一开始就计算整个表格的平均值相同,无论“学校”如何)列)。

标签: sql oracle aggregate-functions


【解决方案1】:
with
     marks ( school, student, mark ) as (
       select 'School 1', 'James' , 5 from dual union all
       select 'School 1', 'Mark'  , 4 from dual union all
       select 'School 1', 'Howard', 5 from dual union all
       select 'School 4', 'Jho'   , 4 from dual union all
       select 'School 5', 'Kate'  , 5 from dual
     ),
     a ( school, s_avg ) as (
       select   school, avg(mark) 
       from     marks
       group by school
     )
select school, student, mark,
       avg(mark) over (partition by school) as avg_by_school,
       (select avg(s_avg) from a) as global_avg
from   marks;


SCHOOL   STUDENT       MARK AVG_BY_SCHOOL GLOBAL_AVG
-------- ------- ---------- ------------- ----------
School 1 James            5         4.667      4.556
School 1 Mark             4         4.667      4.556
School 1 Howard           5         4.667      4.556
School 4 Jho              4         4.000      4.556
School 5 Kate             5         5.000      4.556

5 rows selected.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多