Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
5 years ago

Advanced Calculated Column Evaluation with Dynamic Values, Keys, Operators, and Operands

Is it possible to write something in M Query that evaluates a score based on the distinct key in the same row as the score against a key table that shows all of the associated operators and operands and the resulting value?

 

This is the logical evaluation table I put together in excel. 

 

So if there is key value and score value in a different table, can M Query take the key and score values, lookup to get the associated parameters that match the key in the table below?

 

Example: 

KeyScore
A24

 

If I run the above score against the matching row in the table below, the result should be 1 (Green Result).

 

   Key ScoreRed OperatorRed Operand Red Result   Key ScoreYellow Min OperatorYellow Min Operand   Key ScoreYellow Max OperatorYellow Max Operand Yellow Result    Key ScoreGreen OperatorGreen Operand Green Result  
if[Key]=A1and[Score]>=1then3else if[Key]=A1and[Score]>=0and[Key]=A1and[Score]<=0then2else ifand[Key]=A1and[Score]=0then1  
 [Key]=A2and[Score]>=8then3else if[Key]=A2and[Score]>=5and[Key]=A2and[Score]<=6then2else ifand[Key]=A2and[Score]<8then1  
 [Key]=A3and[Score]>=8then3else if[Key]=A3and[Score]>=70and[Key]=A3and[Score]<=79then2else ifand[Key]=A3and[Score]<8then1  

1 Reply

  • Hi Anonymous 

    Please download this sample PBIX file with code

    I don't have any sample data to use so I just made some up.  If you provide your actual data I can test the code against it.

    Copy/paste this M code into a blank query

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcjRU0lEyUIrVATKNgExDCNMYyDRSio0FAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [Key = _t, Score = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Key", type text}, {"Score", Int64.Type}}),
        #"Added Custom" = Table.AddColumn(#"Changed Type", "Custom", each if [Key] = "A1" then
    
       if [Score] >= 1 then 3 
    
       else if [Score] >= 0 and [Score] <= 0 then 2 
    
       else if [Score] = 0 then 1
    
       else 
    
       if [Key] = "A2" then
    
    	  if [Score] >= 8 then 3 
    
    	   else if [Score] >= 5 [Score] <=	6 then 2 
    
    	   else if [Score] < 8 then 1
    
           else 
    
           if [Key] = "A3" then
    
    	      if [Score] >= 70 and [Score] <= 79 then 2 
    
    	      else if [Score] >= 8 then 3 
    
    	      else if [Score] < 8 then 1	
    
              else null else null else null else null)
    in
        #"Added Custom"

     

    NOTE: Double check this line else if [Score] >= 0 and [Score] <= 0 then 2  because your logic means that this is the same as [Score] = 0 which already has a line to evaluate for this.

    Regards

    Phil