La función Table.Group devuelve una tabla resultado de agrupar la tabla indicada como primer argumento según cierto campo considerado como clave, y tras aplicar a una o más columnas una función de agregación.
Table.Group(
table as table,
key as any,
aggregatedColumns as list,
optional groupKind as nullable number,
optional comparer as nullable function
) as table
- table: tabla a agregar
- key: campo a usar en la agregación de la tabla en grupos
- aggregatedColumns: lista de listas conteniendo dos valores: el nombre del campo a crear y la función de agregación a aplicar
- groupKind: (opcional) criterio de creación de los grupos a partir de la clave
- comparer: (opcional) criterio de comparación a usar
Si solo se desea crear una columna con el resultado de aplicar una función de agregación a la tabla, el parámetro aggregatedColumns puede ser una lista con dos valores: el nombre del campo a crear y la función de agregación a aplicar.
Si, por el contrario, se desea crear más de una columna con el resultado de sendas funciones de agregación, el parámetro aggregatedColumns deberá ser una lista conteniendo una lista para cada una de dichas columnas a crear, cada una de ellas conteniendo la información mencionada: el nombre de la columna y la función de agregación.
Una función de agregación puede involucrar más de un campo.
El parámetro groupKind determina el criterio de creación de los grupos a partir de la clave. Puede tomar dos valores:
Si toma el valor GroupKind.Global (valor por defecto), las filas con el mismo identificador se agruparán en un único bloque con independencia de su posición en la tabla. Por el contrario, si toma el valor GroupKind.Local, las filas con el mismo identificador se agruparán en un mismo bloque solo si están situadas de forma contigua en la tabla. Esto supone que para un identificador dado es posible que se creen varios grupos si es que las filas con dicho identificador están separadas en la tabla.
En este ejemplo partimos de la siguiente tabla, conteniendo información sobre entradas y salidas en varios almacenes que tienen asociado un identificador y un nombre:
let
table = Table.FromRecords(
{
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 2, output = 3],
[id = 3, warehouse = "Zaragoza", input = 7, output = 3],
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 6, output = 1],
[id = 4, warehouse = "La Coruña", input = 4, output = 4]
}
)
in
table
Como puede verse, hay almacenes con más de una fila asociada.
Si quisiéramos obtener, por ejemplo, las entradas totales por almacén, podríamos conseguirlo con el siguiente código:
let
table = Table.FromRecords(
{
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 2, output = 3],
[id = 3, warehouse = "Zaragoza", input = 7, output = 3],
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 6, output = 1],
[id = 4, warehouse = "La Coruña", input = 4, output = 4]
}
)
in
Table.Group(
table,
"id",
{"total input", each List.Sum([input])}
)
Podemos aplicar a los grupos de filas identificados más de una función de agregación. En este segundo ejemplo partimos de la tabla anterior y generamos dos columnas: la primera con la suma de las entradas por almacén, y la segunda con el valor máximo de las salidas:
let
table = Table.FromRecords(
{
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 2, output = 3],
[id = 3, warehouse = "Zaragoza", input = 7, output = 3],
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 6, output = 1],
[id = 4, warehouse = "La Coruña", input = 4, output = 4]
}
)
in
Table.Group(
table,
"id",
{
{"total input", each List.Sum([input])},
{"Max output", each List.Max([output])}
}
)
Las columnas generadas pueden involucrar más de una columna de la tabla original. En este ejemplo estamos creando una columna con el total de entradas menos el total de salidas por almacén.
let
table = Table.FromRecords(
{
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 2, output = 3],
[id = 3, warehouse = "Zaragoza", input = 7, output = 3],
[id = 1, warehouse = "Madrid", input = 3, output = 6],
[id = 2, warehouse = "Barcelona", input = 6, output = 1],
[id = 4, warehouse = "La Coruña", input = 4, output = 4]
}
)
in
Table.Group(
table,
"id",
{"result", each List.Sum([input]) - List.Sum([output])}
)