This FAQ entry is similar conceptually. With traditional universe design, what you are asking for is impossible. You want to display data that doesn’t exist. When joining tables together, you only get data that matches … traditionally only if a “fact” exists.
To change the behavior at the database level would require outer joins. Outer joins don’t “drop” data, but are usually inefficient and usually have undesirable results for most queries, but they are an option.
The other option is to use the “two data provider” technique described in the FAQ. Essentially you are moving the “outer join” functionality to the report. As mentioned though, there are limits when crosstabs or sections are involved.
Another possibility is to create dummy data in the actual database to hold zero amounts. Not popular with the DBAs of course, but is a “last resort” option.