In order for a metric to resolve in a report, it must have dimensionality. A metric is an object that contains instructions on how to take a schema object (such as a fact), and "aggregate" it, or resolve it, to the level of the report (otherwise known as ReportLevel). The level of the report is determined by the intersection of the lowest level attributes on the template and filter.
ApplySimple provides no dimensionality. In a metric, it only works if you pass in objects that already have dimensionality, such as other metrics. In this case, the dimensionality has to be the same in order for the ApplySimple to work. (If they were different, MSTR wouldn't know how to integrate them.)
Therefore, try using ApplyAgg. ApplyAgg provides dimensionality. You don't need to change the structure of your statement; just swap out ApplyAgg for ApplySimple.
The other part is the entry level of the schema objects you are passing in. Facts have an entry level; it defines the level at which the fact is stored. The metric contains instructions on how to aggregate the fact up to the ReportLevel.
When used in a metric, the entry level of an attribute is itself.
In order for a metric expression to resolve, the entry levels of the objects within it must be related, so MSTR can integrate them. If they are totally unrelated, MSTR cannot resolve the expression.
Therefore, I'm pretty sure that in your case, using ApplySimple or ApplyAgg with the attributes won't work. Only the facts, which should have the same entry level, will work.
I'm pretty much self-taught with MSTR; I've tried to deduce its behavior. I'm curious to see if I'm right. Try ApplySimple with the attributes and facts and ApplyAgg with the attributes and facts. Of the four, I'm willing to bet that only ApplyAgg with the facts will work. If one of the others does work, please post the SQL that's generated.