计算用户小时数并得出平均值,包括尚未添加任何小时数的用户

时间:2018-10-02 10:09:44

标签: mysql sql

这是我上一个问题的跟进问题: SQL Query multiple sums and avarage of total

我遇到了与Madhur Bhaiya的答案有关的上一个问题:

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年1月1日):

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

3 个答案:

答案 0 :(得分:4)

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()

您不考虑未记录任何时间的用户的问题是,他们不存在于小时表中,因此,您并不是要在小时表中使用不同用户的数量。

如果您加入users表,则可以获取系统中所有用户的计数,而不是尚未记录小时数的用户的计数,这将为您获得所有用户的平均值,而不仅仅是记录小时数的用户。 / p>

答案 1 :(得分:2)

使用左联接

select SUM(h.hours) / COUNT(DISTINCT users.USER_ID) AS daily_averag
from users left join hours on users.USER_ID=hour.user_id

答案 2 :(得分:2)

您想要一个0x41并将条件放置在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