Forum Discussion

Syndicate_Admin's avatar
Syndicate_Admin
Administrator
1 year ago

Problema de Table.Group

Teniendo en cuenta estos datos de prueba:

Necesito crear una tabla (como la que se muestra a continuación) que combine los nombres:
1. El campo GrpLeader contiene el PersonId del líder del grupo

2. El nombre de grupo resultante debe comenzar con el nombre del líder del grupo, seguido del nombre del otro miembro del grupo y terminar con el apellido. A veces, el líder del grupo no es la persona con el PersonId más bajo, como en el grupo 12

3. Debe tener en cuenta la posibilidad de que haya más de dos miembros en el grupo como en el grupo 13

4. Necesita manejar diferentes apellidos como en el grupo 12

El resultado debería tener el siguiente aspecto:

Table.Group parece ser el punto de partida, pero estoy atascado en los detalles de agregar el apellido y asegurarme de que se sigan los demás detalles anotados. Gracias por cualquier sugerencia.

Steve

7 Replies

  • Hola @newhopepdx,

    Pruebe el siguiente código M de Power Query para crear la tabla que desee. Reemplace 'YourTable' en el paso de origen con su tabla de origen real:

    let
        Source = YourTable,
        AddFullName = Table.AddColumn(Source, "FullName", each [FirstName] & " " & [LastName]),
        
        Grouped = Table.Group(
            AddFullName,
            {"GrpId"},
            {
                {"GroupData", each _, type table [GrpId=number, PersonId=number, GrpLeader=number, FirstName=text, LastName=text, FullName=text]}
            }
        ),
        
        AddGroupName = Table.AddColumn(Grouped, "GroupName", each
            let
                groupTable = [GroupData],
                leaderId = Record.Field(Table.First(groupTable), "GrpLeader"),
                leaderRow = Table.SelectRows(groupTable, each [PersonId] = leaderId){0},
                leaderFirst = leaderRow[FirstName],
                leaderLast = leaderRow[LastName],
                otherMembers = Table.SelectRows(groupTable, each [PersonId] <> leaderId),
                otherFirsts = Table.ToList(Table.TransformColumns(otherMembers, {"FirstName", each _ & ""})),
                lastNames = List.Distinct(Table.Column(groupTable, "LastName")),
                groupName = 
                    if List.Count(lastNames) = 1 then
                        Text.Combine({leaderFirst} & otherFirsts, " ") & " " & lastNames{0}
                    else
                        Text.Combine(List.Combine({{leaderRow[FullName]}, Table.Column(otherMembers, "FullName")}), " & ")
            in
                groupName
        ),
        
        Final = Table.SelectColumns(AddGroupName, {"GrpId", "GroupName"})
    in
        Final

    Si esto ayudó, márquelo como la solución para que otros también puedan beneficiarse. Y si lo encontró útil, siempre se agradecen las felicitaciones.

    Gracias

    Samson

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Administrator

      Samson

      ¡Gracias por la rápida respuesta! Ya casi está ahí. La primera condición en la sección "if List.Count" es generar un error para los grupos 11 y 13.

      groupName = 
                      if List.Count(lastNames) = 1 then
                          Text.Combine({leaderFirst} & otherFirsts, " ") & " " & lastNames{0}

      Este es el error de la segunda fila.

      • Syndicate_Admin's avatar
        Syndicate_Admin
        Administrator

        Hola @newhopepdx, disculpas por el retraso. Pruebe la solución revisada a continuación:

        let
            Source = YourTable,
            AddFullName = Table.AddColumn(Source, "FullName", each [FirstName] & " " & [LastName]),
        
            Grouped = Table.Group(
                AddFullName,
                {"GrpId"},
                {
                    {"GroupData", each _, type table [GrpId=number, PersonId=number, GrpLeader=number, FirstName=text, LastName=text, FullName=text]}
                }
            ),
        
            AddGroupName = Table.AddColumn(Grouped, "GroupName", each
                let
                    groupTable = [GroupData],
                    leaderId = Record.Field(Table.First(groupTable), "GrpLeader"),
                    leaderRow = Table.SelectRows(groupTable, each [PersonId] = leaderId){0},
                    leaderFirst = Text.From(leaderRow[FirstName]),
                    leaderLast = Text.From(leaderRow[LastName]),
                    otherMembers = Table.SelectRows(groupTable, each [PersonId] <> leaderId),
                    otherFirsts = List.Transform(Table.Column(otherMembers, "FirstName"), Text.From),
                    lastNames = List.Distinct(List.Transform(Table.Column(groupTable, "LastName"), Text.From)),
        
                    groupName =
                        if List.Count(lastNames) = 1 then
                            Text.Combine({leaderFirst} & otherFirsts, " ") & " " & lastNames{0}
                        else
                            Text.Combine(
                                List.Transform(
                                    List.Combine({{leaderRow[FullName]}, Table.Column(otherMembers, "FullName")}),
                                    Text.From
                                ),
                                " & "
                            )
                in
                    groupName
            ),
        
            Final = Table.SelectColumns(AddGroupName, {"GrpId", "GroupName"})
        in
            Final
  • Hola

    En caso de que desee una columna calculada y una solución de medición, pruebe este enfoque

    Escribe estas 3 fórmulas de columna calculadas

    Calculated Column 1 = =LOOKUPVALUE(Data[FirstName],Data[Personld],[GrpLeader])&if(CALCULATE(DISTINCTCOUNT(Data[LastName]),FILTER(data,Data[Grpld]=EARLIER(Data[Grpld])))>1," "&LOOKUPVALUE(Data[LastName],Data[Personld],[GrpLeader]),if(CALCULATE(COUNTROWS(Data),FILTER(data,Data[Grpld]=EARLIER(Data[Grpld])))=1," "&Data[LastName],BLANK()))
    Calculated column 2 = =if(or(CALCULATE(COUNTROWS(Data),FILTER(data,Data[Grpld]=EARLIER(Data[Grpld])))=1,CALCULATE(DISTINCTCOUNT(Data[LastName]),FILTER(data,Data[Grpld]=EARLIER(Data[Grpld])))>1),Data[Calculated Column 1],CONCATENATEX(FILTER(Data,Data[Grpld]=EARLIER(Data[Grpld])),Data[FirstName],", "))
    Calculated column 3 = =Data[Calculated Column 2]&if(CALCULATE(DISTINCTCOUNT(Data[LastName]),FILTER(data,Data[Grpld]=EARLIER(Data[Grpld])))>1," & "," ")&if(CALCULATE(COUNTROWS(Data),FILTER(Data,Data[Grpld]=EARLIER(Data[Grpld])))>1,if(CALCULATE(DISTINCTCOUNT(Data[LastName]),FILTER(data,Data[Grpld]=EARLIER(Data[Grpld])))=1,CALCULATE(MAX(Data[LastName]),FILTER(Data,Data[Grpld]=EARLIER(Data[Grpld]))),CONCATENATEX(FILTER(Data,Data[Grpld]=EARLIER(Data[Grpld])&&Data[Personld]<>EARLIER(Data[GrpLeader])),Data[FirstName]&" "&Data[LastName],", ")),BLANK())

    Ahora cree un objeto visual de tabla y arrastre GrpID a las etiquetas de fila. Escribe esta medida

    Medida = max(Datos[Calcular columna 3])

    Espero que esto ayude.

    • Syndicate_Admin's avatar
      Syndicate_Admin
      Administrator

      Asnish,

      Este es un concepto interesante, desafortunadamente necesito terminar con una tabla que no tenga GrpId # duplicados para poder fusionarla con la tabla Personas, agregando los nombres de GroupName a cada registro. No veo una manera de hacer eso fuera del editor de consultas.

      La sugerencia de Samson funciona, excepto por un error en el código (que noté en mi respuesta) y no tengo suficiente experiencia en código M para depurar.