If you're starting from scratch, then my opinion, and I think it is shared by many here, is that using stored procedures or views is the often the best approach to reporting against a SQL Database.
Now for more of my opinion that I won't impute to other folks here: Crystal's strength is in formatting a recordset. Give Crystal a recordset that is as close to how the report should look as possible. In terms of using Crystal as your source for generating queries against SQL, Crystal handles basic joins and record selection (the WHERE clause of a SQL statement)well. But if your data needs to be manipulated (for example, doing a GROUP BY or using subselects), you are better served doing that sort of thing on the database side first, before Crystal gets the records. And most often, a stored procedure or view is the best vehicle for that. Philosophically, it moves much, if not all, of the business logic for a report to a stored procedure, which, depending on your point of view, can make report maintenance easier (or at least serviceable by people who don't need to know a lot about Crystal. As long as the stored procedure continues to return the same columns, just about any SQL person could edit the stored procs.). Many of the posts here could be much more easily addressed if the users were able to use a stored proc or view as their datasource.
That is not to say that Crystal can't handle grouping or other tasks, but simply that it is not as efficient as stored procs and views are at what are really database tasks. And if you're looking to standardize on an approach, then I wuold focus on doing what is most efficient: let your database do what it does best, and let Crystal do what it does best (format the recordset).