bullio
Hola
Tengo una tabla que se ve así:
IDENTIFICACIÓN | ID de persona |
1 | A |
2 | A |
3 | B |
4 | C |
5 | D |
6 | mi |
7 | F |
8 | GRAMO |
9 | GRAMO |
10 | GRAMO |
Quiero agregar una columna que cuente cuántos empleos tiene cada PersonID, por ejemplo:
ID de empleo | ID de persona | Número de empleos |
1 | A | 2 |
2 | A | 2 |
3 | B | 1 |
4 | C | 1 |
5 | D | 1 |
6 | mi | 1 |
7 | F | 1 |
8 | GRAMO | 3 |
9 | GRAMO | 3 |
10 | GRAMO | 3 |
Quiero hacer esto en el Editor de consultas, así que usando M.
Gracias.
mfelix
Hola @bullius,
Debe hacer un grupo por ID de persona y luego hacer una fusión del paso antes del resultado de Agrupar por y Agrupar por, esta parte puede hacerlo fusionando la tabla consigo misma y luego cambiando la primera tabla al paso que usted desear.
Consulte el código M para una tabla de entrada en power query.
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}), #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each Table.RowCount(_), type number}}), #"Merged Queries" = Table.NestedJoin(#"Changed Type",{"PersonID"},#"Grouped Rows",{"PersonID"},"Grouped Rows",JoinKind.LeftOuter), #"Expanded Grouped Rows" = Table.ExpandTableColumn(#"Merged Queries", "Grouped Rows", {"Count"}, {"Grouped Rows.Count"}) in #"Expanded Grouped Rows"
Paso a paso:
Saludos,
mfelix
mfelix
En respuesta a bullio
Hola @bullius,
Usando la opción de @MarcelBeug,
He rehecho el código M:
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}), #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each _, type table}, {"PersonID.1", each Table.RowCount(_), type number}}), #"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"ID"}, {"ID"}) in #"Expanded Count"
Así que este es para Marcel. 😄
Saludos
mfelix
Marcel Beug
En respuesta a mfelix
Gracias @MFélix.
Yo lo hubiera hecho un poco diferente:
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}), #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"AllRows", each _, Value.Type(#"Changed Type")}, {"Count", each Table.RowCount(_), type number}}), #"Expanded AllRows" = Table.ExpandTableColumn(#"Grouped Rows", "AllRows", {"ID"}, {"ID"}) in #"Expanded AllRows"
Te perdiste la parte del video entre 0:30 – 0:50 donde reemplazo tabla de tipos.
Una desventaja (o error o error de diseño o problema) de la operación «Todas las filas» en Agrupar por:
todos los tipos de columna de las tablas anidadas se restablecen a «Cualquiera», que puede ver después de la expansión.
Es por eso que siempre reemplazo type table con Tipo de valor(nombre del paso) donde nombre del paso es el mismo nombre de paso que el primer parámetro de Table.Group.
Todo esto se explica en este fragmento de video, que en realidad es parte de una lista de reproducción de 3 videos sobre Value.Type.
mfelix
Hola @bullius,
Debe hacer un grupo por ID de persona y luego hacer una fusión del paso antes del resultado de Agrupar por y Agrupar por, esta parte puede hacerlo fusionando la tabla consigo misma y luego cambiando la primera tabla al paso que usted desear.
Consulte el código M para una tabla de entrada en power query.
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}), #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each Table.RowCount(_), type number}}), #"Merged Queries" = Table.NestedJoin(#"Changed Type",{"PersonID"},#"Grouped Rows",{"PersonID"},"Grouped Rows",JoinKind.LeftOuter), #"Expanded Grouped Rows" = Table.ExpandTableColumn(#"Merged Queries", "Grouped Rows", {"Count"}, {"Grouped Rows.Count"}) in #"Expanded Grouped Rows"
Paso a paso:
Saludos,
mfelix
Marcel Beug
En respuesta a mfelix
Usar Agrupar por con la operación (adicional) «Todas las filas» es equivalente a fusionar 2 tablas.
bullio
En respuesta a Marcel Beug
¡Gracias por todas tus respuestas!
@MarcelBeug, ¿podría dar un ejemplo del código que incluiría la operación «Todas las filas»?
mfelix
En respuesta a bullio
Hola @bullius,
Usando la opción de @MarcelBeug,
He rehecho el código M:
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}), #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"Count", each _, type table}, {"PersonID.1", each Table.RowCount(_), type number}}), #"Expanded Count" = Table.ExpandTableColumn(#"Grouped Rows", "Count", {"ID"}, {"ID"}) in #"Expanded Count"
Así que este es para Marcel. 😄
Saludos
mfelix
Marcel Beug
En respuesta a mfelix
Gracias @MFélix.
Yo lo hubiera hecho un poco diferente:
let Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXJUitWJVjKCs4yBLCcwywTIcgazTIEsFzDLDMhyBbPMgSw3MMsCyHIHsyzhLEMDCDMWAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [ID = _t, PersonID = _t]), #"Changed Type" = Table.TransformColumnTypes(Source,{{"ID", Int64.Type}, {"PersonID", type text}}), #"Grouped Rows" = Table.Group(#"Changed Type", {"PersonID"}, {{"AllRows", each _, Value.Type(#"Changed Type")}, {"Count", each Table.RowCount(_), type number}}), #"Expanded AllRows" = Table.ExpandTableColumn(#"Grouped Rows", "AllRows", {"ID"}, {"ID"}) in #"Expanded AllRows"
Te perdiste la parte del video entre 0:30 – 0:50 donde reemplazo tabla de tipos.
Una desventaja (o error o error de diseño o problema) de la operación «Todas las filas» en Agrupar por:
todos los tipos de columna de las tablas anidadas se restablecen a «Cualquiera», que puede ver después de la expansión.
Es por eso que siempre reemplazo type table con Tipo de valor(nombre del paso) donde nombre del paso es el mismo nombre de paso que el primer parámetro de Table.Group.
Todo esto se explica en este fragmento de video, que en realidad es parte de una lista de reproducción de 3 videos sobre Value.Type.
mfelix
En respuesta a Marcel Beug
Hola @MarcelBeug,
Tienes razón, hice el cambio pero copié el código M incorrecto: D.
mfelix
mfelix
En respuesta a Marcel Beug
Gracias @MarcelBeug,
Siempre aprendiendo :D:D
mfelix
jthomson
Es casi seguro que hay una manera más eficiente de hacer esto que la siguiente, pero puede:
– Duplica tu consulta
– Agrupe las filas en el duplicado por ID de persona, incluida una columna que cuente el número de filas
– Vuelva a unir esto a su consulta original
editar: acabo de recordar que hago algo bastante similar en uno de mis informes y que no es necesario duplicarlo en absoluto, puede hacer lo mismo que los pasos 2/3 anteriores, pero reformule el paso de agrupación para que cree una nueva tabla, entonces algo como
NewTable = Table.Group(#»Paso anterior», {«ID de empleado»}, {{«Recuento de empleos», cada Table.RowCount(_), escriba el número}}),
ImportNewTable = Table.Join(#»Paso anterior», «ID de empleado», NewTable, «ID de empleado»)
Marcel Beug
Puede utilizar Agrupar por.
Coincidentemente respondí una pregunta similar con un video.
En el video, se devuelve un mínimo en lugar de un conteo, de lo contrario, se ajusta a sus requisitos,