【问题标题】:如何获取MySQL中列的平均值
【发布时间】:2022-01-08 01:13:50
【问题描述】:

我正在尝试找到一种方法来计算列的平均值(作为双精度/浮点数或小数)。我在 MySQL 文档中找到了 AVG 函数,但我无法让它工作。目前我有以下代码:

public double GetRating(string username)
        {
            double average;

            MySqlConnection databaseConnection = new MySqlConnection(connectionString);
            string sumQuery = "select sum('rating') from " + username;
            string countQuery = "SELECT COUNT(*) FROM " + username;
            using (MySqlCommand sumCommand = new MySqlCommand(sumQuery, databaseConnection))
            using (MySqlCommand countCommand = new MySqlCommand(countQuery, databaseConnection))

            try
            {
                databaseConnection.Open();
                
                double sum = (Double)sumCommand.ExecuteScalar();
                double columnLength = (Double)countCommand.ExecuteScalar();
                average = sum / columnLength;
                return average;
             }

            finally
            {
                databaseConnection.Close();
            }

            return average;
        }

现在由于某种原因这不起作用。它返回“无法将'System.Int64'类型的对象转换为'System.Double'类型。”

数据库中存储的数据是一个 int,但我试图将它们转换为加倍。有什么建议或解决方案吗?再来一次; double/float 或 decimal 对我有用。

【问题讨论】:

  • 您可以使用AVG 函数来代替计算总和、计算行数和除值。
  • 我尝试过使用 AVG 功能,但我无法让它工作......你认为你可以给我举个例子吗?
  • 等等:每个用户名都有不同的表?为什么要这么做?您还可以使用 ExecuteReader 从单个 SELECT 返回多个结果

标签: c# mysql sql aggregate-functions


【解决方案1】:

有几点:

  1. 表中rating列的数据类型是什么?如果是整数而不是浮点数,请相应更改sum的数据类型以避免类型转换错误。
  2. 如您所知,您可以使用 avg() 代替 sum(),然后除以 count()。您的 SQL 将如下所示:
select avg(rating) from table_name

【讨论】:

  • (a) avg('rating') 将计算一个没有意义的 string literal 的平均值。更正了代码 (b) 与 sql server 不同,整数列的平均值返回小数而不是整数,因此不需要更改数据类型。
  • 引用是一个错字,可以避免。已修改。
【解决方案2】:

内置的AVG 函数(聚合函数)可以这样使用:

select avg(rating) from table_name

请注意,与大多数聚合函数一样,平均值将排除空值(1, 2, null 的平均值是 1.5 而不是 1.0)。此外,在 MySQL 中,如果您对十进制或整数列求平均值,则返回数据类型将为 decimal,因此请使用适当的 C# 数据类型。

【讨论】:

  • 非常感谢,我不知道它会返回一个小数。现在可以了
  • 实际上 count 返回一个整数,但 sum 根据列返回整数、小数或浮点数。那是您原始代码中的问题。
猜你喜欢
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2021-08-07
  • 1970-01-01
相关资源
最近更新 更多