AVG_POINTS:---

问题描述 投票:0回答:2

比赛表。

GAME_ID - NUMBER    
GAME_DATE - DATE
ARENA - VARCHAR2(20)
HOME - VARCHAR2(30)
AWAY - VARCHAR2(30)
"HOME POINT" - NUMBER
"AWAY POINT" - NUMBER

"HOME "和 "AWAY "是球队的名字 "HOME POINT "和 "AWAY POINT "对应这两列。例如(刚刚用4列表示),我想得到一支球队的平均分。考虑到下面的例子,我想得到AAA、BBB、CCC和DDD球队的AVG积分。

AAA
BBB
90 <- got by AAA
100 <- got by BBB
------------------------
AAA
CCC
99 <- got by AAA
82 <- got by CCC
------------------------
AAA 
DDD
100 <- got by AAA
78 <- got by CCC

我尝试了下面的代码,但结果并不理想。

SELECT HOME, SUM("HOME POINT") + SUM("AWAY POINT") / COUNT(*)
FROM GAME 
GROUP BY HOME
sql oracle group-by average
2个回答
1
投票

解开数据透视并汇总的方法之一是使用 union all:

select team, avg(points)
from ((select home as team, home_points as points from games) union all
      (select away as team, away_points as points from games)
     ) t
group by team;

在甲骨文12C+中,我建议采用横向连接而非 union all.


0
投票

下面是如何使用横向连接的方法;这种语法在Oracle 12c版之后就可以使用了,在这种情况下,它的效率高于 union all因为它不需要扫描两次表格。

select t.team, avg(t.points) avg_points
from games g
cross apply (
    select home team, home_points points from dual
    union all select away, away_points points from dual
) t
group by t.team

侧记。

  • 我建议将点数存储为 int 而不是数字(大概,点数没有小数点)

  • 使用不需要引号的列名 (home_points 胜过 "home point")

这个 在DB Fiddle上演示 与您的样本数据产量。

TEAM 
© www.soinside.com 2019 - 2024. All rights reserved.