HOWTO · MySQL

Calcular porcentaje en MySQL

Este tutorial describe varias formas de calcular el porcentaje en MySQL utilizando una o varias columnas.

En esta página

Para calcular un porcentaje en MySQL, divide la parte entre el total y multiplica por 100: (part / whole) * 100. El denominador determina qué significa el resultado. Para calcular la proporción de una fila, usa la suma de todas las filas; para una razón, usa la columna de comparación; para las proporciones por grupo, usa el total de los grupos. Los ejemplos siguientes muestran cada patrón y cómo redondear o dar formato al resultado.

Calcular el porcentaje de una fila respecto del total

Supongamos que sales tiene las columnas ID, RepresentativeName y Sale, y que las ventas son 15, 15 y 30. El total es 60, por lo que cada fila representa el 25 %, el 25 % y el 50 %, respectivamente. Calcula el total una vez en una subconsulta y luego combina ese resultado de una sola fila con cada venta mediante CROSS JOIN: SELECT s.RepresentativeName, s.Sale, ROUND(s.Sale * 100.0 / totals.SalesSum, 2) AS Percentage FROM sales AS s CROSS JOIN (SELECT SUM(Sale) AS SalesSum FROM sales) AS totals;. El valor 100.0 hace que el cálculo del porcentaje use decimales en vez de depender de la división entera. ROUND(..., 2) conserva dos decimales en el resultado numérico. Para ver el mismo cálculo con la primera venta, ejecuta este pequeño ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

sale = 15
total = 60
percentage = sale * 100 / total
print(f"{percentage:.2f}%")

El total debe ser distinto de cero para que la razón tenga sentido. Si la tabla puede no contener ventas o tener un total igual a cero, trata esa situación explícitamente; por ejemplo, usa NULLIF(totals.SalesSum, 0) como denominador.

Calcular un porcentaje a partir de dos columnas

Para calcular una razón por fila, divide el numerador entre el denominador de esa misma fila. Si tests contiene GroupName, EmployeesCount y SurveysCount, el porcentaje de encuestas es SurveysCount / EmployeesCount * 100. Por ejemplo, 10 encuestas de un total de 200 empleados equivalen al 5 %. Una consulta directa sería SELECT GroupName, EmployeesCount, SurveysCount, ROUND(SurveysCount * 100.0 / NULLIF(EmployeesCount, 0), 2) AS Percentage FROM tests;. NULLIF convierte en NULL un recuento de empleados igual a cero, por lo que el resultado es NULL en lugar de realizar una división entre cero. Esta consulta no necesita ni COUNT() ni GROUP BY: cada fila de origen ya contiene los dos valores que se comparan. Si, en cambio, los valores se agregan a partir de varios registros, define primero el numerador y el denominador que necesitas y luego agrega cada uno de forma coherente.

Calcular el porcentaje de cada grupo respecto del total con una función de ventana

Para obtener la proporción de todos los productos que corresponde a cada proveedor, primero cuenta los productos de cada proveedor y luego divide cada recuento entre el total de los recuentos de esos grupos. Un agregado de ventana aplica ese total a cada fila agrupada: SELECT SupplierID, COUNT(*) AS ProductCount, ROUND(COUNT(*) * 100.0 / SUM(COUNT(*)) OVER (), 2) AS SupplierPercentage FROM products GROUP BY SupplierID;. El COUNT(*) interno cuenta los productos de cada proveedor; SUM(COUNT(*)) OVER () suma los recuentos de los grupos sin reducirlos a una sola fila. Si hay seis productos repartidos en grupos de dos, uno y tres, las proporciones son 33.33 %, 16.67 % y 50.00 %. Este denominador es el total representado por las filas agrupadas de la consulta, así que los filtros afectan tanto a los grupos como al total general. La consulta requiere compatibilidad con funciones de ventana de MySQL; consulta la documentación del servidor si necesitas confirmar la compatibilidad de tu instalación.

Redondear y dar formato a los resultados de porcentaje

ROUND(value, 2) es una función numérica que redondea a dos decimales. Mantén el valor como número si vas a ordenarlo, compararlo o usarlo en otros cálculos. Para mostrar el signo de porcentaje en un resultado de MySQL, usa CONCAT(ROUND(value, 2), '%'); esto produce texto, no un porcentaje numérico, y el formato numérico no garantiza que se conserven los ceros finales. Elige el denominador según la pregunta: la suma de toda la tabla para calcular la proporción de cada fila, una segunda columna para una razón o la suma de las filas agrupadas para calcular la proporción de cada grupo. En todos los casos, usa aritmética decimal y decide cómo debe representar la aplicación un denominador igual a cero.