miércoles, 16 de septiembre de 2026

Cómo generar reportes con Claude y SQL sin crear un dashboard

Claude generando consultas SQL para analizar datos de una aplicación

En un proyecto real no siempre necesitas construir un dashboard para obtener información útil.

A veces una consulta SQL bien hecha puede darte la respuesta en minutos. En este caso necesitábamos responder una pregunta concreta dentro de RapiTaller:

¿La tienda Baterías Panasonic está registrando clientes y mantenimientos?

Para resolverlo usamos Claude + PostgreSQL + consultas SQL.

Claude en la terminal

El problema

La tarea estaba registrada en nuestro grupo interno de WhatsApp. Necesitábamos saber:

  • qué talleres y tiendas tenían actividad;
  • cuántos mantenimientos habían registrado;
  • qué clientes estaban asociados;
  • comparar Panasonic con otros negocios.

Crear una nueva pantalla dentro del panel solo para responder esto habría tomado mucho más tiempo.

La solución rápida fue consultar directamente la base de datos.

1. Ver talleres y tiendas con actividad

Primero necesitábamos una vista general. Esta consulta lista talleres y tiendas y muestra cuántos mantenimientos tienen registrados.

SELECT *
FROM (
    SELECT
        'taller' AS tipo,
        w.id,
        w.store_name,
        COUNT(m.id) AS total_mantenimientos,
        CASE
            WHEN COUNT(m.id) > 0 THEN 'SI'
            ELSE 'NO'
        END AS tiene_mantenimientos
    FROM workshops w
    LEFT JOIN locations l
        ON l.locationable_id = w.id
        AND l.locationable_type = 'workshop'
    LEFT JOIN maintenances m
        ON m.location_id = l.id
    GROUP BY w.id, w.store_name

    UNION ALL

    SELECT
        'tienda' AS tipo,
        c.id,
        c.store_name,
        COUNT(m.id) AS total_mantenimientos,
        CASE
            WHEN COUNT(m.id) > 0 THEN 'SI'
            ELSE 'NO'
        END AS tiene_mantenimientos
    FROM comerces c
    LEFT JOIN locations l
        ON l.locationable_id = c.id
        AND l.locationable_type = 'commerce'
    LEFT JOIN maintenances m
        ON m.location_id = l.id
    GROUP BY c.id, c.store_name
) AS negocios

ORDER BY total_mantenimientos DESC;
Resultado SQL mostrando talleres y tiendas con mantenimientos

Con esta consulta podemos identificar rápidamente qué negocios están utilizando realmente la aplicación.

2. Ver los clientes registrados por cada negocio

Después necesitábamos bajar al detalle. No bastaba con saber que existían registros. Queríamos conocer:

  • cliente;
  • correo;
  • teléfono;
  • vehículo;
  • placa;
  • mantenimiento;
  • fecha del registro.
SELECT
    COALESCE(w.id, c.id) AS negocio_id,
    l.locationable_type AS tipo,
    COALESCE(w.store_name, c.store_name) AS nombre_negocio,
    l.id AS location_id,
    l.name AS nombre_sede,

    o.id AS owner_id,
    u.name AS nombre_cliente,
    u.email AS email_cliente,
    o.phone AS telefono_cliente,

    v.id AS vehicle_id,
    v.license_plate AS placa,

    m.id AS maintenance_id,
    m.type AS tipo_mantenimiento,
    m.title,
    m.description,
    m.it_changed_pieces,
    m.pieces_changed,
    m.it_changed_oil,
    m.current_mileage,
    m.created_at AS fecha_mantenimiento

FROM maintenances m

JOIN locations l
    ON l.id = m.location_id

JOIN vehicles v
    ON v.id = m.vehicle_id

JOIN owners o
    ON o.id = v.owner_id

JOIN users u
    ON u.id = o.user_id

LEFT JOIN workshops w
    ON w.id = l.locationable_id
    AND l.locationable_type = 'workshop'

LEFT JOIN comerces c
    ON c.id = l.locationable_id
    AND l.locationable_type = 'commerce'

ORDER BY negocio_id, m.created_at DESC;
Resultado SQL mostrando clientes y mantenimientos por negocio

También podemos filtrar directamente por negocio:

WHERE COALESCE(w.id, c.id) = 314

Así evitamos revisar manualmente cientos de registros.

Resultado del análisis

El reporte permitió encontrar rápidamente una diferencia importante.

Baterías Panasonic prácticamente no estaba registrando nuevos clientes, mientras que otros negocios, como Reparo al Toque, tenían varios registros.

Ese dato ya puede ser útil para:

  • marketing;
  • seguimiento comercial;
  • soporte;
  • gerencia;
  • capacitación de negocios;
  • detectar usuarios que no están aprovechando la plataforma.

Y todo salió directamente desde la base de datos.

¿Por qué usar Claude para este tipo de tareas?

Claude no reemplaza entender la base de datos.

Pero ayuda bastante cuando ya conoces:

  • las tablas;
  • las relaciones;
  • el objetivo del reporte.

Puedes explicarle algo como:

Necesito identificar qué talleres tienen clientes registrados y cuántos mantenimientos realizó cada uno.

Luego puedes revisar, corregir y ejecutar el SQL generado.

Eso reduce bastante el tiempo necesario para construir consultas largas.

Video: así hice el reporte

En el video muestro el proceso real:

  • revisar el requerimiento;
  • buscar la tienda dentro de RapiTaller;
  • usar Claude desde la terminal;
  • generar las consultas SQL;
  • revisar los resultados;
  • preparar información para las personas encargadas de tomar decisiones.

SQL primero, dashboard después

Esta es la parte más importante. No todos los reportes necesitan inmediatamente:

Frontend
+
Backend
+
Endpoints
+
Filtros
+
Gráficos
+
Permisos
+
Dashboard

Si primero necesitas validar si una información realmente aporta valor, una consulta SQL puede ser suficiente.

El flujo puede ser:

Pregunta del negocio
        ↓
Consulta SQL
        ↓
Reporte
        ↓
Validar utilidad
        ↓
Automatizar
        ↓
Dashboard

Así evitas desarrollar funciones que quizás nadie termine utilizando.

Una posible mejora para el panel

Una idea futura sería agregar dentro del panel administrativo una herramienta interna para ejecutar consultas de lectura.

Algo similar a Adminer, pero mucho más limitado.

Por seguridad debería trabajar con:

  • usuario PostgreSQL exclusivo para reportes;
  • permisos únicamente de lectura;
  • solo operaciones SELECT;
  • límites de filas;
  • timeout de consultas;
  • registro de consultas ejecutadas;
  • acceso únicamente para administradores autorizados.

Nunca expondría un usuario con permisos de UPDATE, DELETE, DROP o escritura general.

Para producción, incluso sería mejor trabajar con reportes predefinidos o consultas parametrizadas antes que permitir SQL arbitrario.

Conclusión

Claude + SQL puede convertirse en una herramienta muy práctica para analizar una aplicación real.

En este caso conseguimos responder rápidamente:

  • quién está usando la plataforma;
  • cuántos registros tiene cada negocio;
  • qué clientes están asociados;
  • qué negocios necesitan seguimiento.

Antes de construir un dashboard completo, muchas veces vale la pena empezar por algo mucho más simple:

hacer la pregunta correcta y consultar directamente los datos.

Autor: Anibal Copitan ()

No hay comentarios: