如何在 SQL 中逐行取两列的平均值?
How to take average of two columns row by row in SQL?
我有一个 table match
看起来像这样(请参阅附图)。我想使用此代码
检索具有 home_goal
和 away_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
)
某些数据库具有允许简化表达式的语法扩展。
我有一个 table match
看起来像这样(请参阅附图)。我想使用此代码
home_goal
和 away_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
)
某些数据库具有允许简化表达式的语法扩展。