Суммируйте пользовательские часы и получайте среднее, включая пользователей, которые еще не добавили ни одного часа - PullRequest
0 голосов
/ 02 октября 2018

Это дополнительный вопрос к моему предыдущему: SQL-запрос нескольких сумм и средняя сумма

Я получил предыдущий вопрос, работая с ответом Мадхура Бхайи:

SELECT SUM(h.hours) / COUNT(DISTINCT h.USER_ID) AS daily_average 
FROM hours AS h
WHERE h.date = CURDATE()

Хотя я понял, что у меня есть дополнительный вопрос:

В моей таблице часов у меня есть два пользователя, которые сообщили о своем времени, хотя я хотел бы, чтобы он рассчитывал на среднее значение всехпользователи, которые существуют.База данных часов выглядит следующим образом:

   #USER_ID #HOURS #DATE
    1        2      2018-01-01
    1        1      2018-01-01
    2        5      2018-01-01
    1        3      2018-01-02
    2        8      2018-01-02
    2        1      2018-01-02

Эта информация находится в моей базе данных пользователей, которая выглядит следующим образом:

#USER_ID #USER_NAME
1        aaa
2        bbb
3        ccc

Любые идеи о том, как это сделать?Я предполагаю, что мне нужно присоединиться к таблицам 'hours' и 'users'?

Желаемый результат будет (НА ОСНОВЕ 2018-01-01):

(HIDDEN INFO: USER 1 TOTAL = 3)
(HIDDEN INFO: USER 2 TOTAL = 5)
(HIDDEN INFO: USER 3 TOTAL = 0)
**AVARAGE: 2,666666667**

Ответы [ 3 ]

0 голосов
/ 02 октября 2018

использовать левое соединение

select SUM(h.hours) / COUNT(DISTINCT users.USER_ID) AS daily_averag
from users left join hours on users.USER_ID=hour.user_id
0 голосов
/ 02 октября 2018

Вы хотите LEFT JOIN и поставить условие для часов в предложении ON:

SELECT SUM(h.hours) / COUNT(DISTINCT u.user_id) as daily_average 
FROM users u LEFT JOIN
     hours h
     ON h.user_id = u.user_id and h.date = CURDATE();

Вышеприведенное абсолютно правильно.Тем не менее, может быть целесообразнее использовать подзапрос в users:

SELECT SUM(h.hours) / (SELECT COUNT(*) FROM users) as daily_average 
FROM hours h
WHERE h.date = CURDATE();
0 голосов
/ 02 октября 2018
SELECT SUM(h.hours) / COUNT(DISTINCT u.USER_ID) AS daily_average 
FROM hours AS h
RIGHT JOIN users u ON h.USER_ID = u.USER_ID
WHERE h.date = CURDATE()

Ваша проблема не учитывать пользователей, которые не записали часы, состоит в том, что их нет в таблице часов, поэтому использование количества отдельных пользователей в таблице часов не то, что выищу.

Если вы присоединитесь к таблице пользователей, вы можете получить количество всех пользователей в системе, а не тех, которые не записали часы, это должно дать вам среднее значение для всех пользователей, а не только для них.которые записали часы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...