Regresar al blog

SQL para análisis de e-commerce en LATAM

DataAlias6 min de lectura

El e-commerce en LATAM creció más de un 25% en los últimos tres años. Empresas como Mercado Libre, Falabella y Rappi generan millones de transacciones diarias. En este artículo vas a aprender a analizar esos datos con SQL desde cero.

Dataset de ejemplo

Trabajaremos con tres tablas típicas de cualquier plataforma de e-commerce:

  • orders — pedidos con estado, monto y fecha
  • order_items — productos dentro de cada pedido
  • users — clientes con fecha de registro y país

Ventas por categoría y mes

La primera pregunta de negocio que siempre aparece: ¿qué categorías venden más y cómo evoluciona en el tiempo?

sql
SELECT
  DATE_TRUNC('month', o.created_at) AS mes,
  p.category                        AS categoria,
  COUNT(DISTINCT o.id)              AS pedidos,
  SUM(oi.quantity * oi.unit_price)  AS venta_total
FROM orders o
JOIN order_items oi ON oi.order_id = o.id
JOIN products p     ON p.id = oi.product_id
WHERE o.status = 'completed'
  AND o.created_at >= '2025-01-01'
GROUP BY 1, 2
ORDER BY 1 DESC, venta_total DESC;

Tasa de conversión por fuente de tráfico

No todos los usuarios que entran compran. Calcular la conversión por fuente te dice dónde invertir en marketing.

sql
SELECT
  u.acquisition_source            AS fuente,
  COUNT(DISTINCT u.id)            AS usuarios,
  COUNT(DISTINCT o.user_id)       AS compradores,
  ROUND(
    COUNT(DISTINCT o.user_id) * 100.0 / COUNT(DISTINCT u.id),
    2
  )                               AS tasa_conversion_pct
FROM users u
LEFT JOIN orders o ON o.user_id = u.id AND o.status = 'completed'
GROUP BY 1
ORDER BY tasa_conversion_pct DESC;

Abandono de carrito

El abandono de carrito es uno de los indicadores más críticos en e-commerce. Un carrito con status = 'abandoned' después de 24 horas representa dinero que se fue.

sql
SELECT
  DATE_TRUNC('week', c.created_at) AS semana,
  COUNT(*) FILTER (WHERE c.status = 'abandoned')    AS carritos_abandonados,
  COUNT(*) FILTER (WHERE c.status = 'converted')    AS carritos_convertidos,
  ROUND(
    COUNT(*) FILTER (WHERE c.status = 'abandoned') * 100.0 / COUNT(*),
    1
  )                                                 AS tasa_abandono_pct
FROM carts c
WHERE c.created_at >= CURRENT_DATE - INTERVAL '90 days'
GROUP BY 1
ORDER BY 1 DESC;

Clientes con mayor valor de vida (LTV)

Identificar los clientes que más compran te permite priorizarlos en campañas de retención.

sql
SELECT
  u.id,
  u.email,
  u.country,
  COUNT(DISTINCT o.id)           AS total_pedidos,
  SUM(o.total_amount)            AS ltv_usd,
  MIN(o.created_at)              AS primer_pedido,
  MAX(o.created_at)              AS ultimo_pedido
FROM users u
JOIN orders o ON o.user_id = u.id
WHERE o.status = 'completed'
GROUP BY 1, 2, 3
HAVING COUNT(DISTINCT o.id) >= 3
ORDER BY ltv_usd DESC
LIMIT 100;

Conclusión

Con estas cuatro queries cubres el 80% de las preguntas que cualquier equipo de e-commerce te va a hacer. El siguiente paso es automatizarlas en un dashboard con Power BI o Metabase, conectado directamente a tu base de datos de producción.