En este escenario partimos de una tabla Sales conteniendo un campo Amount con las cifras de ventas, y un campo Order Date conteniendo la fecha de venta. El objetivo es crear una función de consulta que sume las ventas entre dos fechas que se pasen como argumentos.
El primer paso será filtrar la tabla Sales de forma que solo se consideren aquellos registros en los que el campo Order Date se encuentre entre las dos fechas que pasemos a la función. Para esto podemos usar la función Table.SelectRows que nos permite imponer una condición y filtrar la tabla de forma que solo se devuelvan aquellos registros que la cumplan. Su sintaxis es la siguiente:
table as table,
condition as function
) as table
La condición debe ser una función que devuelva un booleano. En nuestro caso, la condición a satisfacer es (si suponemos que los parámetros de la función que reciben las fechas de comienzo y finalización son startDate y endDate respectivamente):
por lo que podríamos escribir ya una primera versión de nuestra consulta (todavía sin devolver la suma de ventas):
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate)
in
FilteredRows
Se han fijado como fechas el 1 y el 30 de junio de 2016 solo para probar el código.
Vemos que los 18 registros devueltos contienen en la columna Order Date una fecha correspondiente a junio de 2016.
Una vez filtrada la tabla, deberemos seleccionar la columna Amount, lo que podemos conseguir extrayendo la columna en cuestión con la función Table.Column, que devuelve la columna que se indique con formato de lista:
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount")
in
Amount
Por último, para sumar los valores de la lista la función adecuada es List.Sum:
startDate = #date(2016, 6, 1),
endDate = #date(2016, 6, 30),
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
Si queremos convertir esta consulta en una función de consulta, añadimos la cabecera adecuada y eliminamos las dos primeras fórmulas de paso que inicializan las fechas:
let
FilteredRows = Table.SelectRows(Sales, each [Order Date] >= startDate and [Order Date] <= endDate),
Amount = Table.Column(FilteredRows, "Amount"),
TotalSales = List.Sum(Amount)
in
TotalSales
Damos a la consulta un nombre adecuado (SalesInPeriod, por ejemplo) y la invocamos para probarla: