Forum Discussion
Custom Column based on Fact table condition
- 1 year ago
Since you're pulling a value from the Fact table (many-side) into the Dim table (one-side), you must apply an aggregation, like MAXX, MINX, or SELECTEDVALUE. Without it, the engine won’t know which value to return when multiple rows exist.
So yes — your logic is fully achievable as long as the Indicator column in the Fact table has at most one value per ID.
Here’s a DAX expression that does exactly what you need:
Custom =
var from_Fact = MAXX(RELATEDTABLE('Fact'),'Fact'[Indicator])
RETURN
IF('Dim'[Name]="Direct","Direct",
IF('Dim'[Name]="Indirect" && from_Fact="Y","QDP",
"Indirect")
)The pbix is attached
If this post helps, then please consider Accepting it as the solution to help the other members find it more quickly
- 1 year ago
Hi elakkiyaselvan - This cannot be done with a calculated column dim table which only produces 1 row per key.Please check the below logic using calculated table.
DimFact Expanded =FILTER (ADDCOLUMNS (SELECTCOLUMNS (CROSSJOIN ( 'Dim', 'Fact'),"DimID", Dim[ID],"DimName", Dim[Name],"FactID", Fact[ID],"Indicator", Fact[Indicator]),"Custom Column",SWITCH (TRUE(),[DimName] = "Direct" && [DimID] = [FactID], "Direct",[DimName] = "Indirect" && [DimID] = [FactID] && [Indicator] = "Y", "QDP",[DimName] = "Indirect" && [DimID] = [FactID] && [Indicator] = "N", "Indirect",BLANK())),NOT ISBLANK([Custom Column]))Hope this helps.
Since you're pulling a value from the Fact table (many-side) into the Dim table (one-side), you must apply an aggregation, like MAXX, MINX, or SELECTEDVALUE. Without it, the engine won’t know which value to return when multiple rows exist.
So yes — your logic is fully achievable as long as the Indicator column in the Fact table has at most one value per ID.
Here’s a DAX expression that does exactly what you need:
Custom =
var from_Fact = MAXX(RELATEDTABLE('Fact'),'Fact'[Indicator])
RETURN
IF('Dim'[Name]="Direct","Direct",
IF('Dim'[Name]="Indirect" && from_Fact="Y","QDP",
"Indirect")
)
The pbix is attached
If this post helps, then please consider Accepting it as the solution to help the other members find it more quickly
Ritaf1983 Thank you for your assistance. Need your assistance on below output as well. I have added additional condition for 3.Incase if have both Indicator for 3 (If 3 = Y QDP, 3 = N Indirect)
Excepted Output
| DIM | |||
| ID | Name | Custom Column | Condition |
| 1 | Direct | Direct | If Dim(Direct) = Fact(Direct) then Direct |
| 2 | Direct | Direct | If Dim(Direct) = Fact(Direct) then Direct |
| 3 | Indirect | QDP | If Dim(InDirect) = Fact(InDirect) & Fact Indicator = Y then QDP |
| 3 | Indirect | Indirect | If Dim(InDirect) = Fact(InDirect) & Fact Indicator = N then InDirect |
| 4 | Indirect | Indirect | If Dim(InDirect) = Fact(InDirect) & Fact Indicator = N then InDirect |
- rajendraongole11 year agoSuper User
Hi elakkiyaselvan - This cannot be done with a calculated column dim table which only produces 1 row per key.Please check the below logic using calculated table.
DimFact Expanded =FILTER (ADDCOLUMNS (SELECTCOLUMNS (CROSSJOIN ( 'Dim', 'Fact'),"DimID", Dim[ID],"DimName", Dim[Name],"FactID", Fact[ID],"Indicator", Fact[Indicator]),"Custom Column",SWITCH (TRUE(),[DimName] = "Direct" && [DimID] = [FactID], "Direct",[DimName] = "Indirect" && [DimID] = [FactID] && [Indicator] = "Y", "QDP",[DimName] = "Indirect" && [DimID] = [FactID] && [Indicator] = "N", "Indirect",BLANK())),NOT ISBLANK([Custom Column]))Hope this helps.