Power Query Synthax

Un usuario Pregunto ✅

sophie63

Me gustaría crear una columna personalizada (la naranja) en mi tabla, que me diga la evolución del estado de un proyecto en función de la versión de tiempo. Por ejemplo, aquí, en mi ID de proyecto, mis proyectos aparecen tantas veces como se haya guardado una versión de tiempo diferente. Pero me gustaría escribir una fórmula diciéndome en una nueva columna la evolución, si la hay, del estado de cada proyecto entre la versión LIVE y los demás. Sin embargo, no tengo ni idea de cómo podría hacer eso y qué es el Synthax …

¡Gracias por ayudar!EJEMPLO POWER BI.PNG

MarcelBeug

En respuesta a sophie63

Los criterios exactos de verdadero o falso aún no están claros para mí, pero lo intenté.

Creé un archivo de Excel con los datos.

En Power BI, creé el código de Power Query a continuación. Incluye explicaciones (las líneas que comienzan con //).

Puede copiar el código: en Power BI, elija «Obtener datos» – Consulta en blanco – Editor avanzado y reemplace el código predeterminado con el código siguiente. Ajuste la fuente de datos a la suya, elija «Listo» y luego, en la pestaña Inicio, elija Cerrar y cargar.

También creé este video que lo lleva a través de los pasos de la consulta. No es una grabación en vivo de la creación de la consulta, sino un tutorial después de que creé la consulta.

Posiblemente aún se requiera algún ajuste detallado, pero esto debería estar cerca del resultado final.

let
    // Next 3 steps are created when importing the data from Excel
    Source = Excel.Workbook(File.Contents("C:UsersMarcelDocumentsForum bijdragenPower BI CommunityPower Query Syntax - Project status changes.xlsx"), null, true),
    Table1_Table = Source{[Item="Table1",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Table1_Table,{{"PROJECT ID", Int64.Type}, {"STATUS", type text}, {"DATE_VERSION", type text}}),

    // Add Index for the original sort so the data can be sort back at the end
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Original Sort", 1, 1),

    // Add column with real date from [DATE VERSION]. "nl-NL" is used so format DD-MM-YYYY is recognized. 31-12-9999 for "LIVE", so it will sort at the end
    #"Added Custom" = Table.AddColumn(#"Added Index", "Version_Date", each if [DATE_VERSION] = "LIVE" then #date(9999,12,31) else Date.From(Text.Replace([DATE_VERSION],"_","-"),"nl-NL"), type date),

    // Sort on Project and date
    #"Sorted Rows" = Table.Sort(#"Added Custom",{{"PROJECT ID", Order.Ascending}, {"Version_Date", Order.Ascending}}),

    // Add 2 indices so the table can be merged with itself, such that the project and status from the previous row will be on the current row
    #"Added Index1" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1),
    #"Added Index2" = Table.AddIndexColumn(#"Added Index1", "Index.1", 1, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index2",{"Index"},#"Added Index2",{"Index.1"},"Previous",JoinKind.LeftOuter),

    // After the merge, we need the previous project ID and the previous status
    #"Expanded Previous" = Table.ExpandTableColumn(#"Merged Queries", "Previous", {"PROJECT ID", "STATUS"}, {"Previous.PROJECT ID", "Previous.STATUS"}),

    // Add a column with true if: the current version = "LIVE" and the Project ID = Previous Project ID and the Status <> Previous Status, else false 
    #"Added Custom1" = Table.AddColumn(#"Expanded Previous", "LIVE Status <> Previous Status?", each [DATE_VERSION] = "LIVE" and [PROJECT ID] = [Previous.PROJECT ID] and [STATUS] <> [Previous.STATUS], type logical),

    // Sort back to the original sort
    #"Sorted Rows1" = Table.Sort(#"Added Custom1",{{"Original Sort", Order.Ascending}}),

    // Remove columns that are no longer required
    #"Removed Columns" = Table.RemoveColumns(#"Sorted Rows1",{"Original Sort", "Version_Date", "Index", "Index.1", "Previous.PROJECT ID", "Previous.STATUS"})
in
    #"Removed Columns"

sophie63

FORMULAERROR.PNGERROR.PNG

Y ahora estoy intentando eso …

MarcelBeug

En respuesta a sophie63

Parece que está buscando una solución en DAX.

Según las sugerencias de @Sean, puede intentar ajustar «TRUE» a TRUE () y «FALSE» a FALSE ().

Si esto no ayuda y si una solución en Power Query también le parece bien, puedo echarle un vistazo más de cerca hoy.

Sólo házmelo saber,

sophie63

En respuesta a MarcelBeug

Opté por DAX porque pensé que podría encontrar una solución con él, pero no lo hice … Entonces, si logras encontrar una especie de solución, ¡sería genial! Intenté también creando algunas columnas calculadas pero no funcionó. El problema es que hay muchas versiones por proyecto …

Avísame si encuentras la manera.

¡Muchas gracias por ayudar!

MarcelBeug

En respuesta a sophie63

Los criterios exactos de verdadero o falso aún no están claros para mí, pero lo intenté.

Creé un archivo de Excel con los datos.

En Power BI, creé el código de Power Query a continuación. Incluye explicaciones (las líneas que comienzan con //).

Puede copiar el código: en Power BI, elija «Obtener datos» – Consulta en blanco – Editor avanzado y reemplace el código predeterminado con el código siguiente. Ajuste la fuente de datos a la suya, elija «Listo» y luego, en la pestaña Inicio, elija Cerrar y cargar.

También creé este video que lo lleva a través de los pasos de la consulta. No es una grabación en vivo de la creación de la consulta, sino un tutorial después de que creé la consulta.

Posiblemente aún se requiera algún ajuste detallado, pero esto debería estar cerca del resultado final.

let
    // Next 3 steps are created when importing the data from Excel
    Source = Excel.Workbook(File.Contents("C:UsersMarcelDocumentsForum bijdragenPower BI CommunityPower Query Syntax - Project status changes.xlsx"), null, true),
    Table1_Table = Source{[Item="Table1",Kind="Table"]}[Data],
    #"Changed Type" = Table.TransformColumnTypes(Table1_Table,{{"PROJECT ID", Int64.Type}, {"STATUS", type text}, {"DATE_VERSION", type text}}),

    // Add Index for the original sort so the data can be sort back at the end
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Original Sort", 1, 1),

    // Add column with real date from [DATE VERSION]. "nl-NL" is used so format DD-MM-YYYY is recognized. 31-12-9999 for "LIVE", so it will sort at the end
    #"Added Custom" = Table.AddColumn(#"Added Index", "Version_Date", each if [DATE_VERSION] = "LIVE" then #date(9999,12,31) else Date.From(Text.Replace([DATE_VERSION],"_","-"),"nl-NL"), type date),

    // Sort on Project and date
    #"Sorted Rows" = Table.Sort(#"Added Custom",{{"PROJECT ID", Order.Ascending}, {"Version_Date", Order.Ascending}}),

    // Add 2 indices so the table can be merged with itself, such that the project and status from the previous row will be on the current row
    #"Added Index1" = Table.AddIndexColumn(#"Sorted Rows", "Index", 0, 1),
    #"Added Index2" = Table.AddIndexColumn(#"Added Index1", "Index.1", 1, 1),
    #"Merged Queries" = Table.NestedJoin(#"Added Index2",{"Index"},#"Added Index2",{"Index.1"},"Previous",JoinKind.LeftOuter),

    // After the merge, we need the previous project ID and the previous status
    #"Expanded Previous" = Table.ExpandTableColumn(#"Merged Queries", "Previous", {"PROJECT ID", "STATUS"}, {"Previous.PROJECT ID", "Previous.STATUS"}),

    // Add a column with true if: the current version = "LIVE" and the Project ID = Previous Project ID and the Status <> Previous Status, else false 
    #"Added Custom1" = Table.AddColumn(#"Expanded Previous", "LIVE Status <> Previous Status?", each [DATE_VERSION] = "LIVE" and [PROJECT ID] = [Previous.PROJECT ID] and [STATUS] <> [Previous.STATUS], type logical),

    // Sort back to the original sort
    #"Sorted Rows1" = Table.Sort(#"Added Custom1",{{"Original Sort", Order.Ascending}}),

    // Remove columns that are no longer required
    #"Removed Columns" = Table.RemoveColumns(#"Sorted Rows1",{"Original Sort", "Version_Date", "Index", "Index.1", "Previous.PROJECT ID", "Previous.STATUS"})
in
    #"Removed Columns"

sophie63

En respuesta a MarcelBeug

Gracias @MarcelBeug, ¡eso es realmente útil!

Problema resuelto 🙂

¡Que tenga un lindo día!

sophie63

Por ejemplo, estoy intentando eso, pero definitivamente no es la forma correcta. Primero, eso no funciona. En segundo lugar, eso sí tiene en cuenta la variación de un proyecto en particular entre dos fechas / versiones.ex.PNG

sophie63

Gracias a todos ! 🙂 @Sean @Anónimo @MarcelBeug

Ayuda, pero tal vez no fui muy claro en mi solicitud inicial. Es un poco más complicado: tengo una versión de varias fechas (no solo diciembre, sino todos los meses de muchos años), así que quiero obtener un VERDADERO cuando, por ejemplo, hay una variación de estado para el mismo proyecto entre dos versiones (elijo una comparación entre diciembre de 2016 y hoy = EN VIVO). Algo como :

SI (Project_ID = 123 & Version = LIVE & Status = CLOSED) AND (Project_ID = 123 & Version = 01_12_2016 & Status = OPEN) ENTONCES VERDADERO

ELSE FALSE

Pero realmente no sé cómo manejar estos múltiples Y …

Anónimo

Hola @ sophie63

No estoy seguro de haber cumplido bien sus requisitos.

Aquí hay un código para una columna agregada. El código comprueba, si [STATUS] está cerrado o no.

Puede cambiar el código según sus necesidades.

let
    YOUR_LAST_STEP = THE_LAST_LINE_OF_CODE_YOU_WROTE

    #"Added Custom" = Table.AddColumn(YOUR_LAST_STEP, "CLOSED_2017", each if [STATUS] ="CLOSED" then "TRUE" else "FALSE")
in
    #"Added Custom"

und täglich grüsse das Murmeltier.gif

Sean

En respuesta a Anónimo

El Editor de consultas tiene una opción de columna condicional aún más fácil … en la pestaña Agregar columna

Editor de consultas: columna condicional.gif

Entonces lo anterior generará su código M

Sin embargo, si desea que esto se haga con DAX

CLOSED_2017 DAX = IF ( 'Table'[STATUS] = "CLOSED", "TRUE", "FALSE")

También puede usar las funciones VERDADERO () y FALSO () arriba … no las ponga entre comillas

CLOSED_2017 DAX = IF ( 'Table'[STATUS] = "CLOSED", TRUE () , FALSE () )

Columna condicional de DAX.png

¡Espero que esto ayude! Smiley feliz

Anónimo

En respuesta a Sean

Una pregunta, tres soluciones … 😉

¡Eso es Power Query!

MarcelBeug

En respuesta a Anónimo

Caballeros @Anonymous y @Sean

  1. No es solo Power Query, también DAX.
  2. Al usar la funcionalidad «Agregar columna condicional», obtiene «VERDADERO» https://community.powerbi.com/ «FALSO», no las lógicas verdadero / falso (a menos que los parámetros estén definidos para VERDADERO y FALSO y seleccionados en los campos de valores en la pantalla para agregar una columna condicional).

Anónimo

En respuesta a MarcelBeug

@MarcelBeugand @Sean

1. tienes razón, Marcel

2. la solución debe depender de los requisitos del cliente (booleanos o de texto). No lo sabemos por el momento.

Ella lo sabe y nos lo hará 😉

Sean

En respuesta a Anónimo

@MarcelBeug

Mi segunda medida DAX devuelve booleano Smiley feliz

MarcelBeug

En respuesta a Anónimo

Los requisitos tampoco son claros para mí, pero de todos modos esperaría que el resultado fuera un verdadero o falso lógico, no un texto.

Entonces, si «CERRADO» significa verdadero y, de lo contrario, falso, ajustaría el código de @Anónimo a:

let
    YOUR_LAST_STEP = THE_LAST_LINE_OF_CODE_YOU_WROTE

    #"Added Custom" = Table.AddColumn(YOUR_LAST_STEP, "CLOSED_2017", each [STATUS] ="CLOSED")
in
    #"Added Custom"

Pero supongo que los requisitos serán más complicados a medida que obtengamos más explicaciones y ejemplos de @ sophie63

Deja un comentario

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