SQL para análisis de e-commerce en LATAM

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 fechaorder_items— productos dentro de cada pedidousers— 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?
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.
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.
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.
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.