Manual de campo · trampas de SQL
Un conteo por sí solo premia a quien más aparece; una tasa sin un mínimo de muestra premia a quien menos aparece. Hacen falta las dos cosas.
Cualquier ranking de «el mejor», «el más sospechoso» o «la peor tienda»: si el resultado es una proporción, la pregunta inmediata es sobre qué se está dividiendo.
Mal: el conteo se presenta como si fuera una tasa
SELECT tienda, count(*) AS reembolsos
FROM reembolsos
GROUP BY tienda
ORDER BY reembolsos DESC;
-- la tienda con más ventas parece la peor, aunque reembolse menos que nadie
Bien: reembolsos sobre el total de pedidos de esa tienda
SELECT p.tienda,
count(r.pedido_id) * 1.0 / count(p.pedido_id) AS tasa_reembolso,
count(p.pedido_id) AS pedidos
FROM pedidos p
LEFT JOIN reembolsos r ON r.pedido_id = p.pedido_id
GROUP BY p.tienda
HAVING count(p.pedido_id) >= 30 -- sin esto, una tienda con 2 pedidos y 1
-- reembolso «gana» con 50%
ORDER BY tasa_reembolso DESC;
El conteo señala a quien más vende; la tasa sin mínimo, a quien menos, porque con pocos pedidos cualquier proporción extrema es fácil de alcanzar. Un HAVING count(*) >= N descarta las muestras demasiado pequeñas para que la tasa signifique algo, y conviene comparar siempre contra la tasa global: si en total se reembolsa el 5 %, 12 de 80 (15 %) llama la atención; 1 de 2 no dice nada aunque sea «el 50 %».
Esta trampa —y otras cuatro más— están escondidas en un caso de verdad, con datos de verdad.
Jugar el caso 1 gratis →