Resumir pagos por staff
Objetivos
Vas a convertir los registros de pago en un resumen por staff_id y devolver solo las medidas declaradas.
Concepto
Una agregación combina varias filas en una fila por grupo. Aquí payment tiene una fila por pago y staff_id forma el grupo; COUNT cuenta pagos y SUM suma sus importes. La respuesta ya no tiene una fila por payment_id, sino una por staff.
SQLAlchemy crea expresiones SQL a partir de columnas del modelo. group_by(Payment.staff_id) define el grupo y order_by da un orden estable. Una suma es una medida descriptiva del extracto Sakila; por sí sola no explica desempeño, tienda, causas ni una empresa real.
Ejemplo
Define el contrato de respuesta:
from decimal import Decimal
from pydantic import BaseModel
class PaymentSummary(BaseModel):
staff_id: int
payment_count: int
total_amount: DecimalConstruye la consulta de lectura:
from sqlalchemy import func, select
@app.get("/payments/summary", response_model=list[PaymentSummary])
def payment_summary(db: Session = Depends(get_db)) -> list[PaymentSummary]:
statement = (
select(
Payment.staff_id,
func.count(Payment.payment_id).label("payment_count"),
func.round(func.sum(Payment.amount), 2).label("total_amount"),
)
.group_by(Payment.staff_id)
.order_by(Payment.staff_id)
)
rows = db.execute(statement).mappings().all()
return [PaymentSummary.model_validate(row) for row in rows]Cada elemento JSON tiene staff_id, payment_count y total_amount. El total se redondea a dos posiciones para mostrar moneda con la precisión de amount; el redondeo de presentación no debe confundirse con un cálculo financiero más complejo.
Práctica guiada
- Predice cuántos grupos aparecen si el extracto contiene dos
staff_iddistintos. - Identifica qué cambia el grano de pago a grupo.
- Compara la suma de grupos con una suma directa sobre el mismo filtro.
Reto
Agrega a la consulta un filtro opcional por staff_id antes del group_by; conserva el orden y el contrato de salida.
Intenta el reto antes de consultar las pistas.
Quiz
Comprobación
Ya tienes endpoints de lectura para filas y resúmenes. Las siguientes lecciones prueban sus contratos sin necesitar un servidor Sakila activo.