if you use a stored procedure, life shouldn't be
too hard.
you would want to return the same number of columns everytime, with the same names. You can have a column (or I like another table) that will tell CR what to call each column (thus giving the illusion of a cross tabs).
Since you are populating each row (you are doing the pivoting) this will ensure that each column has an entry ( or you can leave it null and set the report to replace NULLs with a default value...0 for numbers)
Your stored proc can also fill in the extra columns that the cross tabs couldn't have (or if you prefer CR could do, but I usually figure you db server would do it more efficently)
then all that is left is for you display the data that your stored proc created/retrieved.
HTH