Forum Discussion
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
- Syndicate_AdminAdministrator
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 FinalSi 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.
GraciasSamson
- Syndicate_AdminAdministrator
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_AdminAdministrator
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
- Syndicate_AdminAdministrator
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_AdminAdministrator
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.