I'm going to assume you're logging hours at the task level, as you're mentioning planned hours. If you're allowing people to log hours against the project, that's a whole other can of worms. You're going to have to do a task level report, and 'pull down' the SOW estimates from the project level. You can roll up total planned hours and total actual hours to the project level, but not by role. So the easy bit is a task level report with project name and task name columns. Then add the 'SOW hours' column (in my example, PM hours). You want to aggregate this on Average, because the total amount will be repeated for each task. You also want to group by project name. To add planned hours only for a particular role, add a column, convert to text mode and use: aggregator.displayformat=intAsInt aggregator.function=SUM aggregator.valueexpression=IF({role}.{name}="Project Manager",DIV({workRequired}/60)) aggregator.valueformat=intAsInt displayname=PM Planned Hours querysort=workRequired textmode=true valueexpression=IF({role}.{name}="Project Manager",DIV({workRequired}/60)) valueformat=intAsInt Actual hours is the same, but replace workRequired with actualWorkRequired (note capitalisation). We have to divide this by 60, because it's reporting minutes. (If you use the native planned and actual hours fields, they are 'compound' and return things like '2 Hours'. If you convert to text, it's minutes). Your report will include every task of every project you include (use filters to control what projects you want) but if you collapse them, the summary line shows what you want. Barry Buchanan Work Management Australia