My question is should i create a single fact table that stores all the information at lowest grain (i.e. hour) and then query this fact table to generate all kinds of reports?
I see a disadvantage to this approach: If I need a weekly report, then lot of time would be taken to query such huge data in way of grouping and summing. So should i be creating a different fact tables which capture the calculated data for different time grains.. like a fact table for weekly reports, another one for monthly reports, and so on? Or should I create just one fact table and have different indexed views for better performance?
One fact table would be the most logical/maintainable solution.
You really shouldn't worry about the performance degradation due to the required aggregation/summation.
You would be surprised as to just how efficiently database engines can aggregate upon integer fields, especially if indexed well.
Also, indexed views is a good idea if you face performance issues.
However, the ideal solution would be to use a dedicated
multi-dimensional "OLAP" engine. (such as Microsoft Analysis Services)
Such engines are designed specifically for quick retrieval of aggregated views of data.