Saltar a contenido

Agregaciones

Una agregación sobre un campo

GET /public/pedido/importe/sum?cliente_id=3
GET /public/pedido/importe/mean
GET /public/pedido/creado_en/max
GET /public/pedido/creado_en/min?min_creado_en=2026-01-01T00:00:00

Con los mismos filtros que la lista. sum y mean necesitan un campo numérico; max y min admiten también fechas. Devuelven una fila con el resultado en data: [{ "group": {}, "data": { "sum_importe": 1200.0 } }].

Varias a la vez, y agrupadas

POST /public/pedido/agg
{
  "operations": {
    "aggregations": { "sum": ["importe"], "count": ["id"] },
    "group_by": ["estado", { "field": "creado_en", "trunc": "month" }],
    "order_by": [{ "operation": "sum", "field": "importe", "direction": "desc" }],
    "limit": 10
  },
  "filters": { "cliente_id": 3 }
}
{
  "status": "success",
  "data": [
    { "group": { "estado": "pagado", "creado_en_month": "2026-09-01T00:00:00" },
      "data": { "sum_importe": 1200.0, "count_id": 8 } }
  ]
}
  • Cada fila es { group, data }. Sin group_by hay una sola, con group vacío.
  • Un in_ con la lista vacía en filters no casa con ninguna fila: la respuesta es la de cero filas —sin group_by, una con count_* = 0 y lo demás null; con él, ninguna—, la misma que con un filtro que no casa con nada, y la operación se valida igual. Antes se agregaba la tabla entera: el DAO trataba la lista vacía como «sin filtro».
  • Los resultados se llaman <operación>_<campo>: sum_importe, count_id.
  • Las operaciones son sum, mean, max, min y count, y cada una admite columnas o expresiones con nombre: { "expr": "precio*cantidad", "alias": "total" } da sum_total.
  • Un campo de fecha en group_by necesita su trunc: year, quarter, month, week, day, hour, minute, o un intervalo (15min, 30min, 3h, 6h, 12h). En group aparece como <campo>_<trunc>.
  • El ejemplo que rellena Swagger al pulsar «Try it out» usa columnas de esa tabla y es válido.

Cuando la operación no se puede hacer

Un campo que no existe, la media de un texto, el max de un enumerado o una agrupación imposible son un 422 con el motivo, y falla la petición entera aunque lo demás fuera válido. count vale para cualquier columna; sum y mean, para números; max y min, para números, fechas y textos; una columna cifrada, hasheada o enumerada solo se cuenta:

{
  "status": "error",
  "errors": [
    { "code": "VALIDATION_ERROR", "field": "field",
      "message": "Valor inválido en parámetro de ruta: 'field' - Campo 'titulo' de tipo 'str' no es válido para 'mean': admite count, max, min" }
  ]
}