这是我上一个问题的跟进问题: 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**
答案 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