jueves, 18 de noviembre de 2021

Power Query: Multiplicar sobre valores null

Quizá nunca te hayas percatado de este aspecto, pero las consecuencias son MUY importantes.
Cuando operamos sobre varias columnas en Power Query empleando List.Product y entre los elementos nos encontramos con un valor null, PQ trata ese null como 1 :OOO ¿cómo!!?
Observa el caso:
Power Query: Multiplicar sobre valores null

Notemos como el uso de la función List.Product en el ejemplo, da tratamiento de 1 al valor null:
let
    Origen = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Producto", type text}, {"Unidades", Int64.Type}, {"Precio", type number}, {"Factor", type number}}),
    MultiplicaciónInsertada = Table.AddColumn(TipoCambiado, "Multiplicación", each List.Product({[Unidades], [Precio], [Factor]}, Precision.Double), type number)
in
    MultiplicaciónInsertada


Matemáticamente es una locura...
Una posible solución sería reemplazar los valores 'null' por cero, lo que debe solucionar el caso:
Power Query: Multiplicar sobre valores null

let
    Origen = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Producto", type text}, {"Unidades", Int64.Type}, {"Precio", type number}, {"Factor", type number}}),
    ValorReemplazado = Table.ReplaceValue(TipoCambiado,null,0,Replacer.ReplaceValue,{"Unidades", "Precio", "Factor"}),
    MultiplicaciónInsertada = Table.AddColumn(ValorReemplazado, "Multiplicación", each List.Product({[Unidades], [Precio], [Factor]}, Precision.Double), type number)
in
    MultiplicaciónInsertada


Pero, sin duda, la solución más óptima pasa por Agregar una columna personalizada donde agreguemos el producto de las columnas necesarias:
Power Query: Multiplicar sobre valores null

let
    Origen = Excel.CurrentWorkbook(){[Name="Tabla1"]}[Content],
    TipoCambiado = Table.TransformColumnTypes(Origen,{{"Producto", type text}, {"Unidades", Int64.Type}, {"Precio", type number}, {"Factor", type number}}),
    //Opción 1 - List.Product
    MultiplicaciónInsertada = Table.AddColumn(TipoCambiado, "Multiplicación", each List.Product({[Unidades], [Precio], [Factor]}, Precision.Double), type number),

    //Opción 2 - Agregar Columna Personalizada
    AddCol_Multiplicacion = Table.AddColumn(MultiplicaciónInsertada, "Personalizado", each [Unidades]*[Precio]*[Factor])
in
    AddCol_Multiplicacion

Con esta opción no es necesario forzar reemplazamiento alguno, y el resultado del producto es el esperado... o al menos lo más cercano a la realidad.

No está claro el porqué de este comportamiento, o por que no existe opción alguna en la configuración de la función que resuelva esta situación...

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.