Перекрестное объединение пользователей (в вопросе) и включение их в условие объединения. Используйте coalesce()
, чтобы получить 0
вместо NULL
для часов недели, когда работа не выполнялась.
SELECT u.user_id,
dht.start_of_week,
dht.end_of_week,
coalesce(sum(hrs.hours), 0)
FROM date_helper_table dht
CROSS JOIN (VALUES ('JIM1')) u (user_id)
LEFT JOIN (SELECT tl.user_id,
dht2.start_of_week,
tl.hours
FROM task_log tl
INNER JOIN date_helper_table dht2
ON dht2.date_value = tl.date_entered) hrs
ON hrs.user_id = u.user_id
AND hrs.start_of_week = dht.start_of_week
GROUP BY u.user_id,
dht.start_of_week,
dht.end_of_week
ORDER BY dht.start_of_week;
Я использовал предложение VALUES
, чтобы перечислить пользователей. Если вы хотите узнать время только для определенных пользователей, вы можете сделать это тоже (или использовать любой другой подзапрос, или ...). В противном случае вы можете использовать свою пользовательскую таблицу (которую вы не опубликовали, поэтому мне пришлось использовать эту замену).
Однако цифры, которые получены этим (и вашим исходным запросом), выглядят странно для меня. В скрипте ваш пользователь проработал всего 23
часов в таблице task_log
. Тем не менее, ваши суммы в результате составляют 24
и 80
, что само по себе намного, а еще хуже, учитывая, что 1
час в task_log
даже не на дату, указанную в date_helper_table
.
Я подозреваю, что вы получите более точные цифры, если просто присоединитесь к task_log
, а не к этой странной производной таблице.
SELECT u.user_id,
dht.start_of_week,
dht.end_of_week,
coalesce(sum(tl.hours), 0)
FROM date_helper_table dht
CROSS JOIN (VALUES ('JIM1')) u (user_id)
LEFT JOIN task_log tl
ON tl.user_id = u.user_id
AND tl.date_entered = dht.date_value
GROUP BY u.user_id,
dht.start_of_week,
dht.end_of_week
ORDER BY dht.start_of_week;
Но, возможно, это только я.
SQL Fiddle