【问题标题】:Find the average of two combined columns in sql在sql中查找两个组合列的平均值
【发布时间】:2013-01-25 02:29:29
【问题描述】:

我想求两列总和的平均值。我想计算 col1 的总数和 col2 的总数,然后找到平均值(它们有多少不同的行)。

我已经设法在这个sqlfiddle 中提出了一个解决方案(另见下文)这是最好的方法吗?我最初认为我需要使用 avg 函数,但使用它无法解决。

    CREATE TABLE test (
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        uid INT,
        col1 INT,
        col2 INT
    ) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;

    INSERT INTO test (id, uid, col1, col2) VALUES
    (1,5,8,12),
    (2,1,2,3),
    (3,1,2,33),
    (4,5,25,50),
    (5,5,22,3);

    (
    SELECT ((sum(col1) + sum(col2))/count(*))
    FROM test
      WHERE uid=5
    )

【问题讨论】:

    标签: mysql sql count average


    【解决方案1】:

    根据定义,AVG(col1) = SUM(col1)/COUNT(*)AVG(col2) = SUM(col2)/COUNT(*),因此 (SUM(col1)+SUM(col2))/COUNT(*) = AVG(col1) + AVG(col2)

    此外,加法的交换性给了我们(SUM(col1)+SUM(col2))/COUNT(*) = SUM(col1+col2)/COUNT(*)AVG(col1+col2)

    【讨论】:

    • 所以 SELECT avg(col1) + avg(col2) FROM test WHERE uid=5 应该可以工作。
    • 这太接近了,这是一个很好的方法,但它是不正确的。两个平均值的和不是两个和的平均值。两个平均值之和除以 2 是两个和的平均值。考虑这个伪代码:avg(1,2,3) + avg(1,2,3) == 4, but avg(1,2,3,3,2,1) == 2 == avg(avg(1,2,3),avg(1,2,3)) == (avg(1,2,3) + avg(1,2,3)) / 2
    • @Ben:我的回答中没有出现任何等于 2 的案例。
    【解决方案2】:

    要使用 avg 函数,

    SELECT avg(col1 + col2)
    FROM test
    WHERE uid=5;
    

    SQLFIDDLE DEMO

    【讨论】:

    • 为什么要使用 group by? uid 是主键。
    • 我的错。正在尝试别的东西,却忘了把它取下来。现在编辑答案。
    【解决方案3】:

    我在这里得到了答案,所以我会添加这个可能对其他人有帮助的注释:

    1.avg(col1+col2) as avg_col1_plus_col2,
    2.avg(col1) + avg(col2) as avg_col1_plus_avg_col2,
    3.avg(col1+col2)/2 as avgTotal1, 
    4.avg(col1)/2+avg(col1)/2 as avgTotal2
    

    第 1 句等于第 2 句,正如 egyal 解释的那样,语法还可以,但从逻辑上讲它不是我们想要的结果,所以我们需要将平均值除以第 3 句和第 4 句中的列数。

    【讨论】:

      【解决方案4】:
      SELECT avg(col1 + col2) as avgtotal
      
      FROM test
      WHERE uid=5
      

      【讨论】:

        【解决方案5】:

        这是你要找的吗?

        SELECT avg(col1 + col2)
        FROM test
        where uid = 5
        group by uid
        

        【讨论】:

          【解决方案6】:
          SELECT ((SUM(col1) + SUM(col2)) / (COUNT(col1) + COUNT(col2))) as a
          FROM test
          WHERE uid=5;
          

          【讨论】:

          • 缺少右括号
          猜你喜欢
          • 2018-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-30
          • 1970-01-01
          • 2021-02-25
          • 2015-03-22
          相关资源
          最近更新 更多