在SQL中找到两个合并列的平均值

10
我想要找到两列总和的平均值。我想要计算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
    )
6个回答

14

根据定义,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 应该可以工作。 - luckystars
3
这个方法非常接近正确的做法,但却不正确。两个平均数的和不等于两个总和的平均数。两个平均数的总和除以2才是两个总和的平均数。请考虑以下伪代码:avg(1,2,3) + avg(1,2,3) == 4,但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
@Ben:我的答案中没有任何等于2的情况。 - eggyal

2
使用平均值函数,
SELECT avg(col1 + col2)
FROM test
WHERE uid=5;

SQLFIDDLE DEMO


为什么要使用group by?uid是主键。 - luckystars
我的错。我在尝试其他东西并忘记把它关掉了。现在已经编辑答案了。 - Orangecrush

1
SELECT avg(col1 + col2) as avgtotal

FROM test
WHERE uid=5

1
我在这里得到了答案,所以我会添加这个注释,希望能帮助其他人:
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

正如eggyal所解释的那样,句子1等于句子2,语法没问题,但逻辑上不是我们想要的结果,因此我们需要像句子3和4中那样按列数除以平均值。


1
SELECT ((SUM(col1) + SUM(col2)) / (COUNT(col1) + COUNT(col2))) as a
FROM test
WHERE uid=5;

缺少闭合括号 - DependencyHell

0

这是你要找的吗?

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接