从按条件分组的所有记录中获取AVG,然后获得这些平均值的AVG

时间:2016-10-07 11:49:39

标签: mysql sql average

我有以下表格:

+--------+-------+
|Username|Points |
+--------+-------+
|User1   | 75.00 |
|User1   | 87.50 |
|User1   |100.00 |
|User1   | 40.00 |
|User1   | 50.00 |
|User2   |100.00 |
|User3   | 37.50 |
|User3   | 12.50 |
+--------+-------+

我希望查询只显示带有User1的1个字段,其中5个字段的平均值为username = User1,而User3则相同。然后获得所有用户的平均值。

所以它会是:

AVG (avg user1 + avg user2 + avg user3)

任何想法如何实现?

我尝试了以下但是给了我错误的平均值:

SELECT ROUND(AVG(finalgrade),2) AS grade FROM
(
SELECT DISTINCT(u.username), gg.finalgrade AS finalgrade FROM ...

很多JOIN和WHERE

)
AS average

5 个答案:

答案 0 :(得分:0)

您需要使用子查询。首先根据用户获得平均值,然后对其进行平均,就像你说的那样:

SELECT AVG(points) from (
  SELECT AVG(points) AS points FROM ... GROUP BY username) a;

不需要DISTINCT。

答案 1 :(得分:0)

尝试使用以下查询。

 SELECT Username, ROUND(AVG(Points),2) AS Points 
        FROM YourTable
          JOIN...
        GROUP BY username

答案 2 :(得分:0)

你需要这个:

SELECT 
     * 
FROM
(
    (
         SELECT
              UserName
              ,AVG(Points) AS AvgUserPoints
         FROM <table>
         GROUP BY UserName
    ) AS T1
    INNER JOIN 
    (
         SELECT
             AVG(Points) AvgPoints 
         FROM <table>
    ) AS T2 ON 1=1
)

答案 3 :(得分:0)

我们说这个表是: 创建表user_points (username varchar(10),points number(5,2));

以下查询以行显示结果:

select username, avg(points) from user_points where username in ('User1','User3') group by username
union all
select 'All', avg(points) from user_points;

要在列中获得相同的结果,您需要一个包含单个行和列的表,并在3个单独的子查询中实现AVG。

答案 4 :(得分:0)

select username,avg(points) averg,count(*) obs
from t
group by username with rollup

结果

+----------+------------+-----+
| username | averg      | obs |
+----------+------------+-----+
| User1    |  70.500000 |   5 |
| User2    | 100.000000 |   1 |
| User3    |  25.000000 |   2 |
| NULL     |  62.812500 |   8 |
+----------+------------+-----+
相关问题