I usually connect directly to the SQL tables, doing all the joins in Tableau, and let Tableau create the appropriate aggregation queries. If that is insufficient, such as when I need to join between databases, which Tableau doesn't allow, I build a view in SQL, or Custom SQL in Tableau, with just JOINS and WHERE clauses. I rarely need to do a GROUP BY in a view or custom SQL If I have performance issues, I either create an extract or pre-aggregate into staging tables in SQL and report from that in Tableau. That is usually the last resort, and only when I don't need the detail.
I don't know if this answers your question, but it is at least another perspective.
Thanks for your reply. I'm not looking for a particular answer, just wanted to get an idea of what the community is doing when faced with a similar issues.
In my organization we usually let Tableau do the work. (Or we let me, as the Tableau guy, write the calcs and table calcs that let Tableau do the work.)
Sometimes aggregates and other calculations are already available from other programs within the organization, and at times we just grab a second data source with that stuff and I just blend it in.
And sometimes things are just way too expensive (especially time-wise to generate in a real-time user experience), so we generate that in its own data source and blend it in. Look up "Rolling COUNTD" for an example of that.
Tableau is pretty darned powerful, and people around here are ready to share ideas, experiences and examples of ways they've achieved things that others ask here. There are a million corners in this tool, and different people have experience (sometimes VERY DEEP experience!) in different areas.
For the record, in our operation just about every data source is a Tableau Data Extract. Most get updated by scheduled runs daily.
Thanks for your reply guys, I looked into LOD and I believe this is the best approach to solving the issue presented above.