Zou zoiets werken? Ik heb soortgelijke gevallen gehad als die van u, en ik heb de join eenvoudig uit de hiërarchische query verwijderd en pas daarna toegepast om te voorkomen dat er rijen verloren gaan.
SELECT TaskName, Sum(ts.hours) "TotalHours"
FROM (
SELECT replace(sys_connect_by_path(decode(level, 1, t.name), '~'), '~') As TaskName, t.id
FROM tasks t
START WITH PARENTOID=-1
CONNECT BY PRIOR t.id = t.parent_id
) tasks
INNER JOIN timesheets ts ON tasks.id=ts.task_id
GROUP BY TaskName Having Sum(ts.hours) > 0 ORDER BY TaskName