Получить среднее значение из всех записей, сгруппированных по условию, а затем получить среднее значение из этих средних

У меня есть следующая таблица:

+--------+-------+
|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 |
+--------+-------+

Я хочу, чтобы запрос показал только 1 поле с User1 со средним из 5 полей, Где username = User1 и то же самое с User3. Затем получить среднее всех пользователей.

Так было бы:

AVG (avg user1 + avg user2 + avg user3)

Есть идеи, как это сделать?

Я попробовал следующее, но дает мне неправильный avg:

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

много соединений и где

)
AS average

5 ответов

  1. Необходимо использовать вложенный запрос. Сначала получите среднее значение, основанное на пользователе, а затем усредните их, как вы сказали:

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

    Нет необходимости в различении.

  2. Вам это нужно:

    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. Допустим, таблица:
    создать таблицу user_points
    (имя пользователя varchar (10), количество очков (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;
    

    Чтобы получить тот же результат в Столбцах, вам нужна таблица с одной строкой и столбцом, и реализовать AVG в 3 отдельных вложенных запроса.

  4. 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 |
    +----------+------------+-----+