Cree una tabla de referencias cruzadas con 1 y 0, basada en dos columnas en Power Query

Un usuario Pregunto ✅

valcat27

Hola a todos,

Quiero crear una tabla de referencias cruzadas entre dos columnas «ClientID» y «ProductID», en Power Query.

El objetivo es ver, por filas, qué productos compró cada cliente. Para eso, también agregué una columna con el valor 1, así:

Identificación del cliente Identificación de producto Valor
1 1 1
2 1 1
3 2 1
2 2 1
3 1 1
4 4 1
1 3 1
1 1 1

Intenté usar la opción Agrupar por en la columna «ProductID», seleccionando la columna «Valor» para Columna de valores campo y «Suma» para Función de valor agregado campo. Sin embargo, devolvió solo 3 filas de ClientID y no entiendo qué está fallando.

Para concluir, esta es la tabla de referencias cruzadas que quiero:

Identificación del cliente 1 2 3 4
1 1 0 1 0
2 1 1 0 0
3 1 1 0 0
4 0 0 0 1

Cabe señalar que, cuando un cliente compra un producto una o más veces, el valor que debe surgir es 1.

Las tablas que se muestran son solo una muestra de lo que tengo.

Gracias por adelantado,

valcat27

Hola @AlexisOlson y @edhans,

Lo siento mucho … Pensé que había seleccionado el foro de Power Query, pero me acabo de dar cuenta de que no lo hice.

Quiero aplicar esa transformación en PowerQuery porque esta aún no es mi tabla final. Aplicaré más transformaciones después de …

Espero que aún puedas ayudarme y muchas gracias por tus respuestas.

edhans

En respuesta a valcat27

Seleccionaste el foro de PQ @ valcat27; lo moví al foro de escritorio porque pensé que se trataba de un objeto visual de Matrix. Moviéndolo hacia atrás. 😂

Dicho esto, mira si esto funciona. Gira su columna de ID de producto y agrega usando la función MAX.

edhans_0-1616779965863.png

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSgeJYnWglIxSeMZBlhCJnhCKHUGkCZJnAeSBxYxQeVGUsAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ClientID = _t, #"ProductID " = _t, Value = _t]),
    #"Pivoted Column" = Table.Pivot(Source, List.Distinct(Source[#"ProductID "]), "ProductID ", "Value", List.Max)
in
    #"Pivoted Column"

Sin embargo, necesitaría saber más de sus datos para saber si esto tiene sentido. Generalmente, NO desea desnormalizar sus datos en Power Query de esta manera. Hace que el DAX subsecuente sea más difícil como regla, pero eso es desde mi perspectiva aquí, no en su asiento con todo su proyecto presentado ante usted.

Cómo utilizar el código M proporcionado en una consulta en blanco:
1) En Power Query, seleccione New Source, luego Blank Query
2) En la cinta de Inicio, seleccione el botón «Editor avanzado»
3) Elimina todo lo que ves, luego pega el código M que te he dado en ese cuadro.
4) Presione Listo
5) Consulte este artículo si necesita ayuda para usar este código M en su modelo.

valcat27

En respuesta a Edhans

Gracias @edhans,

Pegué su código y obtuve ese resultado, pero esto es solo una muestra.

¿Me pueden ayudar a adaptar el código a mis datos?

Estas son mis últimas filas al abrir «Editor avanzado»:

# «Columna de valor agregada» = Table.AddColumn (# «Ordenar columnas», «Valor», cada 1)

# «Change Type» = Table.TransformColumnTypes (# «Columna de valor agregada», {{«ProductID», escriba texto}}),
en
# «Tipo de cambio»

Traté de agregar algo como eso:

# «Columna de valor agregado» = Table.AddColumn (# «Ordenar columnas», «Valor», cada 1)

# «Change Type» = Table.TransformColumnTypes (# «Columna de valor agregada», {{«ProductID», escriba texto}}),

# «Columna dinámica» = Table.Pivot (# «Tipo de cambio», List.Distinct (# «Tipo de cambio»[#»ProductID»]), «ProductID», «Valor», List.Max)
en
# «Columna dinámica»

pero me devuelve solo cuatro filas y no todas las filas.

Edhans

En respuesta a valcat27

Tendrá que darme algunos datos de muestra o, mejor aún, un libro de trabajo de Excel o un archivo PBIX con los datos incrustados (función Ingresar datos) con un resultado esperado. El código que hice arriba funciona con sus datos originales, pero si no funciona con sus otros datos, necesito ver la estructura de su tabla real. Sin embargo, debe cambiar los datos para que sean falsos.
Cómo obtener una buena ayuda rápidamente. Ayúdanos a ayudarte.

Cómo hacer una pregunta técnica si realmente quiere una respuesta

Cómo obtener una respuesta rápida a su pregunta: denos una explicación buena y concisa
Cómo proporcionar datos de muestra en el foro de Power BI: proporcione datos en un formato de tabla según el enlace, o comparta un archivo Excel / CSV a través de OneDrive, Dropbox, etc. Proporcione el resultado esperado utilizando una captura de pantalla de Excel u otra imagen. No proporcione una captura de pantalla de los datos de origen. No puedo pegar una imagen en tablas de Power BI.

valcat27

En respuesta a Edhans

Hola @edhans,

Gracias por su esfuerzo, pero no puedo compartir los datos necesarios para crear la tabla dinámica. Por esa razón, compartí esa tabla, que tiene la misma estructura que mis datos originales pero con muchas menos filas y valores falsos.

Esto es lo que hice:

1) Datos importados de SQL

2) Se cambió el tipo de columna de ProductID de «número entero» a «texto».

3) Columna «Valor» añadido

4) Se cambió el tipo de columna de Valor de «cualquier» a «número entero».

En este punto tengo una tabla como la que compartí en la primera publicación. El tipo de columnas ClientID y ProductID son «texto» y tienen valores duplicados. El tipo de columna Valor es «número entero» y solo contiene el valor 1.

Después de eso, apliqué su fórmula y así es como se ve mi editor avanzado:

dejar

Fuente = Sql.Database (…),

# «Change Type» = Table.TransformColumnTypes (Fuente, {{«ProductID», escriba texto}}),

# «Columna de valor agregado» = Table.AddColumn (# «Tipo de cambio», «Valor», cada 1),

# «Change Type1» = Table.TransformColumnTypes (# «Columna de valor agregada», {{«Value», Int64.Type}}),

# «Columna dinámica» = Table.Pivot (# «Cambiar tipo1», List.Distinct (# «Cambiar tipo1″[ ProductID]), «ProductID», «Valor», List.Max)

en

# «Columna dinámica»

Como resultado, obtuve una tabla con solo 4 filas (en lugar de miles como se esperaba) y miles de columnas (ProductID’s) como se esperaba. Mi problema son los otros ClientID que no están presentes en esta tabla final.

Edhans

En respuesta a valcat27

No sé. El mío funciona bien. Tenía 4 clientes y 4 filas. Se agregó un quinto cliente y automáticamente pasó a 5 filas.

edhans_0-1617131204739.png

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSgeJYnWglIxSeMZBlhCJnhCKHUGkCZJnAeSBxYxQeQqUpQmUsAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ClientID = _t, #"ProductID " = _t, Value = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Value", Int64.Type}}),
    #"Pivoted Column" = Table.Pivot(#"Changed Type", List.Distinct(#"Changed Type"[#"ProductID "]), "ProductID ", "Value", List.Max)
in
    #"Pivoted Column"

Sin embargo, deberíamos dar un paso atrás y averiguar cuál es su objetivo aquí. usted No quiero para importar una tabla con miles de columnas en el modelo DAX. No es así como está diseñado. A. Todos. Mesas estrechas y altas en formato Star Schema es lo que busca.

Entonces, en lugar de pedirnos que lo ayudemos a hacer algo en Power Query, cree que necesita hacer algo más adelante, puede reformular la pregunta para decir «Este es mi conjunto de datos, y este es el elemento visual que quiero mostrar» y podemos pasar de allí.

valcat27

En respuesta a Edhans

Hola @edhans,

Gracias por sus recomendaciones.

De hecho, no quiero importar esta tabla al modelo DAX. Esta es solo una de algunas transformaciones que quiero aplicar hasta que la tabla final se importe al modelo DAX.

Mi idea era crear esta tabla ejecutando un script de Python. Sin embargo, no funcionó como mostré en esta publicación: IndexError: el índice 1323169739 está fuera de los límites para … – Comunidad de Microsoft Power BI

También intenté crear la tabla dinámica en SLQ y luego importarla a Power BI, pero tampoco la obtuve. Entonces, ahora estaba tratando de hacerlo en Power Query.

De todos modos, intentaré otros enfoques.

Edhans

En respuesta a valcat27

Entendido @ valcat27 – No entiendo por qué mi código no funcionó para usted. No pude hacer que no funcionara. Esperamos que encuentre una respuesta para su solución.

Edhans

@ valcat27

Entiendo esto:

edhans_0-1616707630107.png

Usé el cliente en las filas, el ID del producto en la columna de un objeto visual de Matrix, luego para Valores usé la función COUNTROWS () como se muestra arriba. Eso cuenta la cantidad de veces que el cliente compró un producto. No necesita la columna Valores.

Sin embargo, si los valores son una cantidad que se agregará y es posible que no siempre sea 1 en su ejemplo, cambie mi medida de:

Total Value = COUNTROWS('Table')

a esto:

Total Value = SUM('Table'[Value])

En este caso, devuelven lo mismo, pero no lo harán si su columna Valores tiene algo más que un 1. Depende de lo que desee, pero si siempre tiene 1, elimine los valores y use la función Countrows en la medida.

Alternativamente, si siempre quieres un 1 sin importar cuántas veces compren, considera esto:

Total Value = 
VAR varRecordCount = COUNTROWS('Table')
RETURN
IF(
    varRecordCount,
    1,
    0
)

Todavía no necesita la columna Valores, y si hay alguna filas, esto devolverá un 1.

AlexisOlson

Puede obtener lo siguiente con bastante facilidad si coloca Cliente en filas y Producto en valores en una matriz visual con Valor en el campo de valores (elija el máximo para la agregación):

AlexisOlson_0-1616706932328.png

La dificultad surge si realmente necesitas los ceros. Dado que ClientID y ProductdID están en la misma tabla, DAX realiza una optimización de autoexistencia detrás de escena para que las combinaciones vacías nunca se evalúen y no devuelvan nada. Reemplazar el espacio en blanco con cero en la medida no ayuda en absoluto, ya que la medida nunca se evalúa.

Para obtener los ceros, necesitaría tablas de dimensiones para que el Cliente y el Producto se puedan filtrar de forma independiente. Vea también mis comentarios sobre esta pregunta relacionada.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *