如何在 SQL 中逐行取两列的平均值?

How to take average of two columns row by row in SQL?

我有一个 table match 看起来像这样(请参阅附图)。我想使用此代码

检索具有 home_goalaway_goal 平均值列的数据集
SELECT 
    m.country_id, 
    m.season,
    m.home_goal,
    m.away_goal,
    AVG(m.home_goal + m.away_goal)  AS avg_goal
FROM match AS m;

但是,我得到了这个错误

column "m.country_id" must appear in the GROUP BY clause or be used in an aggregate function
LINE 3:  m.country_id,

我的问题是:为什么需要 GROUP BY 子句?为什么 SQL 不知道如何逐行取两列的平均值?

谢谢。

试试这个:

SELECT 
    m.country_id, 
    m.season,
    m.home_goal,
    m.away_goal,
    (m.home_goal + m.away_goal)/2  AS avg_goal
FROM match AS m;

有人要求您提供 group_by,因为 avg() 很像 sum() 对一列的多个值进行处理,您可以根据 [= 对组中不是按列操作的所有列进行分类11=]

您希望对两个不同的列进行平均 - 它是按行运算而不是按列运算

how to take average of two columns row by row?

您不为此使用 AVG();它是一个聚合函数,对一组行进行操作。在这里,您似乎只想要一个简单的数学计算:

SELECT 
    m.country_id, 
    m.season,
    m.home_goal,
    m.away_goal,
    (m.home_goal + m.away_goal) / 2.0 AS avg_goal
FROM match AS m;

注意小数分母 (2.0):这避免了实现它的数据库中的整数除法。

Avg 在上述函数的上下文中是计算列值的平均值,而不是同一行中两个值的平均值。它是一个聚合函数,这就是为什么需要 group by 子句的原因。

为了取同一行中两列的平均值,您需要除以 2。

让我们考虑以下 table:

CREATE TABLE Numbers([x] int, [y] int, [category] nvarchar(10));

INSERT INTO Numbers ([x], [y], [category])
VALUES
    (1, 11, 'odd'),
    (2, 22, 'even'),
    (3, 33, 'odd'),
    (4, 44, 'even');

这是使用两个聚合函数(AVG 和 SUM)与 GROUP BY 的示例:

SELECT
  Category,
  AVG(x) as avg_x,
  AVG(x+y) as avg_xy,
  SUM(x) as sum_x,
  SUM(x+y) as sum_xy
FROM Numbers
GROUP BY Category
  

结果有两行:

Category    avg_x   avg_xy  sum_x   sum_xy
even    3   36  6   72
odd     2   24  4   48

请注意,Category 在 SELECT 部分可用,因为结果是由它 GROUP BY 的。如果未指定 GROUP BY,则结果将是 1 行并且 Category 不可用(如果我们对具有不同 caetories 的多行进行总和和平均值,应显示哪个值?)。

您想要的是计算一个新列,为此您不使用聚合函数:

SELECT
  (x+y)/2 as avg_xy,
  (x+y) as sum_xy
FROM Numbers

这 returns 所有行:

avg_xy  sum_xy
6   12
12  24
18  36
24  48

如果您的列是整数,请不要忘记处理舍入,如果需要的话。例如(CAST(x AS DECIMAL)+y)/2 as avg_xy,

简单算术计算:

(m.home_goal + m.away_goal) / 2.0

并不完全等同于 AVG(),因为 NULL 值搞砸了。支持横向连接的数据库提供了一种非常简单(且高效)的方式来在一行中实际使用 AVG()

安全版本如下:

(coalesce(m.home_goal, 0) + coalesce(m.away_goal, 0)) /
nullif( (case when m.home_goal is not null then 1 else 0 end +
         case when m.away_goal is not null then 1 else 0 end
        ), 0
      )

某些数据库具有允许简化表达式的语法扩展。