There will be situations in the business to build a report with multiple facts using confirmed as well as non-confirmed dimensions.
Below is an example to demonstrate the configuration in OBIEE 11g.
DIM_1 is non-confirmed dimension and DIM_2 is confirmed dimension.
Below are the steps to configure in the OBIEE 11g.
Import all the DIMS and FACTs, apply physical joins as shown in the above picture.
Create a logical model and move a fact which has maximum joins along with corresponding dims, example above move FACT_2, DIM_1 and DIM_2. Rename the fact table like fact.
Add other fact measures from physical layer to BBM layer model (example to fact logical table). This will bring two LTS to the logical fact as shown below.
Next, create dimension hierarchies and add the aggregation to the measures based on requirements (example sum)
Go to the Amount measure properties and in the content tab set the DIM2 level to Total, as this measure from FACT_1 doesn’t have join to DIM_2,  this will make it level based measure. If you don’t set the level to total, the query will provide null values for amount measure. If you want to avoid nulls, add detail level for all the confirmed dimensions.
Promote the model to presentation layer and create the report.
The above report will provide data from two facts with non-confirmed dimension. The report will create two separate physical queries and combine both the results using full outer join. Below are the physical queries.
Physical Query when the level is set to Total.
WITH
SAWITH0 AS (select sum(T758957.DISCOUNT) as c1,
T758947.NAME2 as c2,
T758944.NAME as c3
from
DIM_1 T758944,
DIM_2 T758947,
FACT_2 T758957
where ( T758944.DIM_1_KEY = T758957.DIM_1_KEY and T758947.DIM_2_KEY = T758957.DIM_2_KEY )
group by T758944.NAME, T758947.NAME2),
SAWITH1 AS (select sum(T758950.AMOUNT) as c1,
T758944.NAME as c2
from
DIM_1 T758944,
FACT_1 T758950
where ( T758944.DIM_1_KEY = T758950.DIM_1_KEY )
group by T758944.NAME),
SAWITH2 AS (select D1.c1 as c1,
D1.c2 as c2,
D1.c3 as c3,
D1.c4 as c4,
D1.c5 as c5
from
(select 0 as c1,
case when D1.c3 is not null then D1.c3 when D2.c2 is not null then D2.c2 end as c2,
D1.c2 as c3,
D2.c1 as c4,
D1.c1 as c5,
ROW_NUMBER() OVER (PARTITION BY D1.c2, case when D1.c3 is not null then D1.c3 when D2.c2 is not null then D2.c2 end ORDER BY D1.c2 ASC, case when D1.c3 is not null then D1.c3 when D2.c2 is not null then D2.c2 end ASC) as c6
from
SAWITH0 D1 full outer join SAWITH1 D2 On SYS_OP_MAP_NONNULL(D1.c3) = SYS_OP_MAP_NONNULL(D2.c2)
) D1
where ( D1.c6 = 1 ) )
select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4, D1.c5 as c5 from ( select D1.c1 as c1,
D1.c2 as c2,
D1.c3 as c3,
D1.c4 as c4,
D1.c5 as c5
from
SAWITH2 D1
order by c1, c2, c3 ) D1 where rownum <= 500001
Physical Query when the level is left blank.
WITH
SAWITH0 AS (select sum(T758957.DISCOUNT) as c1,
T758944.NAME as c2,
T758947.NAME2 as c3
from
DIM_1 T758944,
DIM_2 T758947,
FACT_2 T758957
where ( T758944.DIM_1_KEY = T758957.DIM_1_KEY and T758947.DIM_2_KEY = T758957.DIM_2_KEY )
group by T758944.NAME, T758947.NAME2)
select D1.c1 as c1, D1.c2 as c2, D1.c3 as c3, D1.c4 as c4, D1.c5 as c5 from ( select distinct 0 as c1,
D1.c2 as c2,
D1.c3 as c3,
cast(NULL as DOUBLE PRECISION ) as c4,
D1.c1 as c5
from
SAWITH0 D1
order by c2, c3 ) D1 where rownum <= 500001
Thanks,
Santosh