Skip to content
Report · Projects

Project hours by resource by month

Hours logged per employee per month, billable and non-billable, with the billable share.

  • time
  • utilization
  • drill-through
Sample preview, fictional dataYour own figures appear after import.

01

About this report

Time entries grouped by employee and month for the last 24 months. Each row gives total hours, billable hours, non-billable hours, the billable share, and the number of customers or projects the time was logged against.

Click Hours to open Time entries filtered to that employee and month. Group by Quarter for utilization reviews. The billable share is recalculated from the hours, not averaged. The report needs time tracking.

02

Sample preview

Fictional figures in the shape you will see. Yours come from your account.

MonthEmployeeHoursBillable hoursNon-billable hoursBillable shareCustomers and projects
2026-09Dana Whitfield118.5010216.500.865
2026-09Marco Ruiz9671.2524.750.744
2026-09Priya Natarajan88.754048.750.453
2026-08Dana Whitfield151139.5011.500.926

03

The SuiteQL

This is the query each report runs. Read it, copy it, or change it after import.

Project hours by resource by month
SELECT TO_CHAR(tb.trandate, 'YYYY-MM') AS period,
       BUILTIN.DF(tb.employee) AS employee,
       SUM(tb.hours) AS hours,
       SUM(CASE WHEN tb.isbillable = 'T' THEN tb.hours ELSE 0 END) AS billable_hours,
       SUM(CASE WHEN tb.isbillable = 'T' THEN 0 ELSE tb.hours END) AS non_billable_hours,
       SUM(CASE WHEN tb.isbillable = 'T' THEN tb.hours ELSE 0 END) / NULLIF(SUM(tb.hours), 0) AS billable_share,
       COUNT(DISTINCT tb.customer) AS projects
  FROM timebill tb
 WHERE tb.trandate >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -23)
   AND tb.trandate <= SYSDATE
 GROUP BY TO_CHAR(tb.trandate, 'YYYY-MM'), BUILTIN.DF(tb.employee)
 ORDER BY period DESC, hours DESC
Time entries
SELECT TO_CHAR(tb.trandate, 'YYYY-MM') AS period,
       TO_CHAR(tb.trandate, 'YYYY-MM-DD') AS tran_date,
       BUILTIN.DF(tb.employee) AS employee,
       NVL(e.altname, e.entityid) AS customer_or_project,
       BUILTIN.DF(tb.item) AS service_item,
       tb.isbillable AS billable,
       BUILTIN.DF(tb.approvalstatus) AS approval_status,
       tb.hours AS hours,
       tb.memo AS memo
  FROM timebill tb
  LEFT JOIN entity e ON e.id = tb.customer
 WHERE tb.trandate >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -23)
   AND tb.trandate <= SYSDATE
 ORDER BY tb.trandate DESC, employee

04

Appears in

ReportProjects

Project hours by resource by month

Screenshot of the Project hours by resource by month report in HiScale Advanced Reports, filled with fictional sample data
Sample preview, fictional dataOpen image full size (opens in a new tab)